【问题标题】:Changing the height of UIToolbar in iOS 7在 iOS 7 中更改 UIToolbar 的高度
【发布时间】:2013-10-05 10:22:44
【问题描述】:

我正在尝试在新的 iOS 7 项目中更改 UIToolbar 的高度,但我无法做到。

我正在使用 UINavigationController 来管理几个 UIViewController。 我尝试通过导航控制器设置工具栏的框架,但可惜的是,工具栏属性是只读的。

我查看了“Is there a way to change the height of a UIToolbar?”,但没有成功。

我尝试继承 UIToolbar,强制自定义高度并在情节提要中设置正确的类,但这也没有用,高度一直是 44px。

我想过自动布局无法对工具栏的大小设置任何约束,每个字段都被禁用。

我可以在 UIBarButtonItem 中设置自定义视图,其高度比工具栏大。大项目将正确呈现,但会从工具栏溢出。

这是我能做的最好的:screenshot

真的可以在 iOS 7 中改变 UIToolbar 的高度吗? 还是我应该创建一堆自定义项目来模仿它?

【问题讨论】:

    标签: ios ios7 toolbar uitoolbar


    【解决方案1】:

    按照@Antoine 的建议,使用sizeThatFits,这是我的工具栏子类,高度为 64:

    import UIKit
    
    class Toolbar: UIToolbar {
        override func layoutSubviews() {
            super.layoutSubviews()
            frame.size.height = 64
        }
    
        override func sizeThatFits(size: CGSize) -> CGSize {
            var size = super.sizeThatFits(size)
            size.height = 64
            return size
        }
    }
    

    然后,在初始化导航控制器时,我说它应该使用那个类:

    let navigationController = UINavigationController(navigationBarClass: nil, toolbarClass: Toolbar.self)
    

    【讨论】:

      【解决方案2】:

      我发现设置工具栏高度的最简单方法是使用高度约束,如下所示:

      let toolbarCustomHeight: CGFloat = 64
      
      toolbar.heightAnchor.constraintEqualToConstant(toolbarCustomHeight).active = true
      

      【讨论】:

      • 更好的解决方案!
      【解决方案3】:

      我已通过继承 UIToolbar 并粘贴以下代码来解决此问题:

      override func layoutSubviews() {
          super.layoutSubviews()
      
          var frame = self.bounds
          frame.size.height = 52
          self.frame = frame
      }
      
      override func sizeThatFits(size: CGSize) -> CGSize {
          var size = super.sizeThatFits(size)
          size.height = 52
          return size
      }
      

      【讨论】:

      • 如果可能的话,你能发布整个子类吗?
      • 我为底部工具栏尝试了相同的子类。这会增加高度,但将工具栏设置为顶部左侧的 0,0。所以我搜索并找到了另一种“约束”方式。我们需要设置高度约束(选择工具栏元素,选择 Editor > Pin > Height 来创建约束)。我希望这对其他人有帮助。
      • 为什么要使用 self.frame 来设置新的矩形?通过修改边界并将新值设置为框架,您将始终将视图放置在左上角 (0,0)。
      【解决方案4】:

      如果您对所有屏幕使用相同的高度,这应该可以解决问题

      extension UIToolbar {
          open override func sizeThatFits(_ size: CGSize) -> CGSize {
              return CGSize(width: UIScreen.main.bounds.width, height: 60)
          }
      }
      

      【讨论】:

        【解决方案5】:

        尽管许多解决方案都指向了正确的方向,但它们要么存在一些布局问题,要么无法正常工作。所以,这是我的解决方案:

        Swift 3,自定义 UIToolbar 子类

        class Toolbar: UIToolbar {
        
            let height: CGFloat = 64
        
            override func layoutSubviews() {
                super.layoutSubviews()
        
                var newBounds = self.bounds
                newBounds.size.height = height
                self.bounds = newBounds
            }
        
            override func sizeThatFits(_ size: CGSize) -> CGSize {
                var size = super.sizeThatFits(size)
                size.height = height
                return size
            }
        }
        

        【讨论】:

          【解决方案6】:

          您可以使用以下代码在 iOS 7 中自定义 UIToolbar 的高度。我已经在我当前的项目中对其进行了测试和工作。

          - (void)viewWillAppear:(BOOL)animated {
              [super viewWillAppear:animated];
          
              // Make the Toolbar visible with this line OR check the "Shows Toolbar" option of your Navigation Controller in the Storyboard
              [self.navigationController setToolbarHidden:NO];
          
              CGFloat customToolbarHeight = 60;
              [self.navigationController.toolbar setFrame:CGRectMake(0, self.view.frame.size.height - customToolbarHeight, self.view.frame.size.width, customToolbarHeight)];
          }
          

          【讨论】:

          • 当您尝试处理从 UINavigationController 自动添加的 UIToolbar 时,此代码只会弄乱您的栏(肮脏的编程风格)。如果用户不使用 UINavigationController 那么它肯定不起作用。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多