IOS 11では大きなタイトルのnavbarを使用していますが、バーボタンアイテムを追加すると、元のタイトルのnavbarと同じ場所に奇妙な位置に表示されます。タイトルが大きい場合はバーボタンアイテムを下に移動し、ナビゲーションバーが大きくならない場合は元の位置に戻します。これを行う最良の方法は何でしょうか?
これは、バーボタンアイテムの奇妙な位置を示す画像です
ViewWillLayoutSubviews()を使用してナビゲーションバーの高さを動的に取得できますが、setTitlePositionAdjustmentを使用してバーボタン項目の位置を変更することはできません。
override func viewWillLayoutSubviews() {
guard let navbarHeight = self.navigationController?.navigationBar.frame.height else{ return }
}
私自身の問題を解決するために、navbarのサブビューとしてボタンを追加し、右と下の制約をnavbarに設定しました。これで、ナビゲーションバーのサイズが変更されると、ボタンが上下に移動します。ただし、このView Controllerからセグエを表示するView Controllerでは、ボタンを削除する必要があります。したがって、ボタンに1のタグを追加し、他のView Controllerのスーパービューから削除しました。これはそれを解決する最も簡単な方法であり、最も簡単な方法であることがわかりました。
右ボタンを設定するには:
func setupNavBar() {
self.title = "Home"
self.navigationController?.navigationBar.prefersLargeTitles = true
self.navigationController?.navigationBar.isTranslucent = false
let searchController = UISearchController(searchResultsController: nil)
self.navigationItem.searchController = searchController
let rightButton = UIButton()
rightButton.setTitle("Right Button", for: .normal)
rightButton.setTitleColor(.purple, for: .normal)
rightButton.addTarget(self, action: #selector(rightButtonTapped(_:)), for: .touchUpInside)
navigationController?.navigationBar.addSubview(rightButton)
rightButton.tag = 1
rightButton.frame = CGRect(x: self.view.frame.width, y: 0, width: 120, height: 20)
let targetView = self.navigationController?.navigationBar
let trailingContraint = NSLayoutConstraint(item: rightButton, attribute:
.trailingMargin, relatedBy: .equal, toItem: targetView,
attribute: .trailingMargin, multiplier: 1.0, constant: -16)
let bottomConstraint = NSLayoutConstraint(item: rightButton, attribute: .bottom, relatedBy: .equal,
toItem: targetView, attribute: .bottom, multiplier: 1.0, constant: -6)
rightButton.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([trailingContraint, bottomConstraint])
}
Show segued View Controllerから削除するには:
func removeRightButton(){
guard let subviews = self.navigationController?.navigationBar.subviews else{return}
for view in subviews{
if view.tag != 0{
view.removeFromSuperview()
}
}
}
両方の関数は、viewWillAppear関数で呼び出されます
あなたがしたいことは、BarButtonItem
のタイトル位置調整を設定することです。 viewWillAppear
funcに次の行を追加します。 vertical
とhorizontal
の値を試して、好みのlayout
を取得します。
navigationItem.rightBarButtonItem?.setTitlePositionAdjustment(.init(horizontal: 10, vertical: 20), for: UIBarMetrics.default)
https://developer.Apple.com/documentation/uikit/uibarbuttonitem/1617149-settitlepositionadjustment
良い方法は、バーのボタンが自動的に調整されるように、ナビゲーションタイトルが大きい場合に調整できることです。これがコードです。また、iOSメールアプリケーションも参照用に同じことを行います。
func adjustsTitle() {
guard let font = UIFont(name: "Helvetica-Medium", size: 16) else { return }
let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
label.textColor = UIColor.black
label.textAlignment = .center
label.text = navigationItem.title
label.adjustsFontSizeToFitWidth = true
navigationItem.titleView = label
}
更新された回答タイトルの下にあるボタンを調整したい場合は、この場合、ナビゲーションバーにカスタムビューを読み込む必要があります。
//Hide back button. Since you are going to have custom button
navigationItem.hidesBackButton = true
//Increase the height based on your view intrinsic content size
navigationController?.navigationBar.frame.size.height = 100
guard let yourCustomView = UINib(nibName: "yourCustomXib", bundle: nil).instantiate(withOwner: nil, options: nil).first as? YourCustomView else {
fatalError("Missing yourCustomXib")
}
navigationController?.navigationBar.addSubview(yourCustomView)