【问题标题】:Cannot change navigation bar item height in iOS 11无法在 iOS 11 中更改导航栏项目高度
【发布时间】:2018-04-11 04:08:47
【问题描述】:

自定义导航栏高度大于默认值(44pt)后,我想更改右侧导航栏项目按钮的高度,但限制在44pt。我怎样才能让它更高?我知道在 iOS 11 中,按钮现在位于 UIBarButtonStackView 内,似乎我们无法更改堆栈视图框架?

我使用这段代码来改变按钮的宽度和高度:

button.widthAnchor.constraint(equalToConstant: 40).isActive = true
button.heightAnchor.constraint(equalToConstant: 60).isActive = true
button.translatesAutoresizingMaskIntoConstraints = false
button.setImage(image, for: .normal)

let barButton = UIBarButtonItem(customView: button)
self.navigationItem.rightBarButtonItem = barButton

谢谢!

【问题讨论】:

  • 看一次可能对你有帮助stackoverflow.com/questions/31940352/…
  • @Anbu.karthik 我要改导航栏项按钮,不是导航栏,你的回答是关于导航栏的。
  • 您是否在栏按钮项中设置了任何图像或只是自定义图标?
  • @MdRashedPervez 我确实为栏按钮设置了图像,我已经更新了问题。
  • 好的.. 现在我明白了.. 您只能更改项目的宽度而不是高度。高度会根据导航栏的高度自动改变。我会给你下面的代码。

标签: ios swift uinavigationbar


【解决方案1】:

您可以使用此代码更改导航栏按钮项的宽度 -

override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            var frame: CGRect? = navigationItem.leftBarButtonItem?.customView?.frame
            frame?.size.width = 5  // change the width of your item bar button
            self.navigationItem.leftBarButtonItem?.customView?.frame = frame!
        }
        override var prefersStatusBarHidden : Bool {
            return true
        }

或者来自故事板-

确保您的Assets.xcassets 图像设置为Render As - Original 图像就像-

【讨论】:

  • 谢谢。我现在可以更改条形按钮的高度,工作得很好,但是当我设置 frame.origin.y = -20 向下移动按钮时,它不起作用。你有什么想法吗?
  • 按钮将按比例占据中心位置。顺便说一下,-20 会将按钮向上移动而不是向下移动。
  • 就我而言,它没有居中。它始终坚守在顶部
  • 如果您使用图像视图而不是条形按钮项,那么您的开发将非常容易。你应该试试看。
  • 我没试过,你的意思是用imageView作为UIBarButtonItem的自定义视图吧?还是只是图像视图?如何将图像视图添加到导航栏?
【解决方案2】:

使用 UInavigationcontroller 类和 NavigationBar 类的子类可以实现这一点。 我正在分享一些代码片段:

class ARVNavigationController { 
 init(rootViewController: UIViewController) {
 super.init(navigationBarClass: AVNavigationBar.self, toolbarClass: nil)

viewControllers = [rootViewController] }}



class AVNavigationBar { 

 let AVNavigationBarHeight: CGFloat = 80.0


 init?(coder aDecoder: NSCoder) {
 super.init(coder: aDecoder)
 initialize()
}



init(frame: CGRect) {
super.init(frame: frame ?? CGRect.zero)
initialize()
}

func initialize() {
   transform = CGAffineTransform(translationX: 0, y: +AVNavigationBarHeight)
}

func layoutSubviews() {
   super.layoutSubviews()
   let classNamesToReposition = ["_UINavigationBarBackground", "UINavigationItemView", "UINavigationButton"]
   for view: UIView? in subviews() {
       if classNamesToReposition.contains(NSStringFromClass(view.self)) {
         let bounds: CGRect = self.bounds()
         let frame: CGRect? = view?.frame
         frame?.origin.y = bounds.origin.y + CGFloat(AVNavigationBarHeight)
         frame?.size.height = bounds.size.height - 20.0
         view?.frame = frame ?? CGRect.zero
       }
   }
}

 func position(for bar: UIBarPositioning) -> UIBarPosition {
    return .topAttached
 }

}

【讨论】:

  • 如果条件用于检查 UINavigationController 中的哪些元素要更改,例如 _UINavigationBarBackground UINavigationItemView
  • 我试图打印出子视图类名,但是没有 UINavigationItemView 或 UINavigationButton。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 2018-03-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多