web-dev-qa-db-ja.com

iOS 11で大きなタイトルを使用する場合のバーボタンアイテムの位置を調整する

IOS 11では大きなタイトルのnavbarを使用していますが、バーボタンアイテムを追加すると、元のタイトルのnavbarと同じ場所に奇妙な位置に表示されます。タイトルが大きい場合はバーボタンアイテムを下に移動し、ナビゲーションバーが大きくならない場合は元の位置に戻します。これを行う最良の方法は何でしょうか?

これは、バーボタンアイテムの奇妙な位置を示す画像です

largeTitleNavbar

ViewWillLayoutSubviews()を使用してナビゲーションバーの高さを動的に取得できますが、setTitlePositionAdjustmentを使用してバーボタン項目の位置を変更することはできません。

override func viewWillLayoutSubviews() {
    guard let navbarHeight = self.navigationController?.navigationBar.frame.height else{ return }
}
17
Ali

私自身の問題を解決するために、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関数で呼び出されます

6
Ali

あなたがしたいことは、BarButtonItemのタイトル位置調整を設定することです。 viewWillAppear funcに次の行を追加します。 verticalhorizontalの値を試して、好みのlayoutを取得します。

navigationItem.rightBarButtonItem?.setTitlePositionAdjustment(.init(horizontal: 10, vertical: 20), for: UIBarMetrics.default)

https://developer.Apple.com/documentation/uikit/uibarbuttonitem/1617149-settitlepositionadjustment

3
ap147

良い方法は、バーのボタンが自動的に調整されるように、ナビゲーションタイトルが大きい場合に調整できることです。これがコードです。また、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)
1
Hussain Shabbir