簡體   English   中英

將 UINavigationBar 標題與右側的按鈕對齊,如 iOS13 消息應用程序

[英]Align UINavigationBar title with button on the right like iOS13 Messages app

UINavigationBar中將右欄按鈕項與左標題對齊的最佳方法是什么? (現在我在右上角有圖標)

情況1:僅右圖標

如果只需要設置兩個右側的barButton圖標,請在viewDidLoad下面調用該方法。

說明:創建兩個navBar按鈕項目,然后使用固定的墊片將其分開,然后根據設計規范選擇間距,並根據Apple HIG正確設置圖標的圖像名稱(我發現22 x 22px〜25 x 25px是一個很好的自定義范圍,但是您可以根據設計規格進行更改。

   private func setUpRightNavBarIcons() {
         let editBarButtonItem = UIBarButtonItem(image: UIImage(named: "yourEditIconImageName")?.withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(editButtonItemTapped))
         let moreBarButtonItem = UIBarButtonItem(image: UIImage(named: "yourMoreIconImageName")?.withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(moreBarButtonItemTapped))
        let fixedSpacer = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: self, action: nil)
        fixedSpacer.width = 22
        self.navigationItem.rightBarButtonItems = [fixedSpacer,editBarButtonItem, moreBarButtonItem]
    }

    @objc private func moreBarButtonItemTapped() {
        print("moreBarButtonItemTapped")
        // TODO: - Add your logic
    }

    @objc private func editButtonItemTapped() {
        print("editButtonItemTapped")
           // TODO: - Add your logic
    }

案例2:左標題/大標題

您可以使用兩種方法來進行對齊。

  1. 通過在ViewDidLoad上調用以下方法自行設置
private func setLeftAlignedNavBarTitle() {
   let label = UILabel()
   label.sizeToFit()
   let titleAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 25, weight: .bold), NSAttributedString.Key.foregroundColor: UIColor.black]
   label.attributedText = NSAttributedString(string: "Message", attributes: titleAttributes)
   /// Make this label as leftBar Button
   let leftButtonView = UIBarButtonItem(customView: label)
   navigationItem.leftBarButtonItem = leftButtonView
}

2.另一種選擇是允許在viewDidLoad上顯示大標題並免費獲得它,如下所示:-

navigationController?.navigationBar.prefersLargeTitles = true

注意:-如果需要在右側,請使用第一種方法並將其設置為rightBarButtonItem。

也許有更正確和最優的解決方案,但它適合我。 不要被語法嚇到,我用的是SnapKit

  1. 創建按鈕或視圖
lazy private var settingsButton = UIButton().then {
        $0.setImage(Image.settings, for: .normal)
    }
  1. 覆蓋viewDidAppear(_ animated: Bool)
navigationController?.navigationBar.subviews.forEach { subview in
    let stringFromClass = NSStringFromClass(subview.classForCoder)
    guard stringFromClass.contains("UINavigationBarLargeTitleView") else { return }
    subview.subviews.forEach { label in
        guard label is UILabel else { return }
        subview.addSubview(settingsButton)
        settingsButton.snp.makeConstraints{
            $0.top.equalTo(label)
            $0.right.equalToSuperview().offset(-14)
            $0.height.width.equalTo(35)
        }
    }
}

  1. 設置UIScrollViewDelegate並在scrollViewDidScroll方法中獲得navigationBar scrollViewDidScroll狀態,然后隱藏/顯示UIBarButtonItem

結果

截屏

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM