Swift 4 - Tab Bar项目按钮

Mar*_*rco 2 uitabbar ios swift

我正在尝试将自定义按钮放在我的标签栏的其中一个项目上.

func setupMiddleButton() {

    let numberOfItems = CGFloat(tabBar.items!.count)
    let tabBarItemSize = CGSize(width: tabBar.frame.width / numberOfItems, height: tabBar.frame.height)
    let menuButton = UIButton(frame: CGRect(x: 0, y: 0, width: tabBarItemSize.width, height: self.tabBar.frame.size.height))
    var menuButtonFrame = menuButton.frame
    menuButtonFrame.origin.y = self.view.bounds.height - menuButtonFrame.height
    menuButtonFrame.origin.x = self.view.bounds.width/2 - menuButtonFrame.size.width/2
    menuButton.frame = menuButtonFrame

    menuButton.backgroundColor = UIColor.white

    self.view.addSubview(menuButton)


    self.view.layoutIfNeeded()
Run Code Online (Sandbox Code Playgroud)

我的问题是,使用前面的代码,按钮不完全在条形项上(见图): 在此输入图像描述

有什么建议吗?我真的不知道怎么试试.

谢谢!

Sti*_*Sti 8

我注意到这个截图是iPhone X模拟器,它在屏幕底部有不同的布局.您的代码适用于任何其他iPhone.在iOS 11中,他们推出了所谓的"安全区域".计算按钮的大小和原点时,必须考虑到这一点.

计算origin.ybuttonFrame时,必须在底部减去安全区域的高度,如下所示:

menuButtonFrame.origin.y = self.view.bounds.height - menuButtonFrame.height - self.view.safeAreaInsets.bottom
Run Code Online (Sandbox Code Playgroud)

这不会解决您的问题,因为您的代码可能会运行viewDidLoad,这在视图知道它应该显示在具有安全区域的iPhone X上之前发生.

您可以viewDidLayoutSubviews为此覆盖,并在每次调用时为您的按钮设置正确的帧.

这将解决您的问题:

class CustomTabBarViewController: UITabBarController {

    let menuButton = UIButton(frame: CGRect.zero)
    override func viewDidLoad() {
        super.viewDidLoad()
        setupMiddleButton()
    }
    func setupMiddleButton() {
        let numberOfItems = CGFloat(tabBar.items!.count)
        let tabBarItemSize = CGSize(width: tabBar.frame.width / numberOfItems, height: tabBar.frame.height)
        menuButton.frame = CGRect(x: 0, y: 0, width: tabBarItemSize.width, height: tabBar.frame.size.height)
        var menuButtonFrame = menuButton.frame
        menuButtonFrame.origin.y = self.view.bounds.height - menuButtonFrame.height - self.view.safeAreaInsets.bottom
        menuButtonFrame.origin.x = self.view.bounds.width/2 - menuButtonFrame.size.width/2
        menuButton.frame = menuButtonFrame
        menuButton.backgroundColor = UIColor.green
        self.view.addSubview(menuButton)
        self.view.layoutIfNeeded()
    }
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        menuButton.frame.origin.y = self.view.bounds.height - menuButton.frame.height - self.view.safeAreaInsets.bottom
    }
}
Run Code Online (Sandbox Code Playgroud)

固定

我知道setupMiddleButton从内部打电话很诱人viewDidLayoutSubviews,但不要这样做.viewDidLayoutSubviews不应该用于创建按钮等,它应该只用于相应地移动到视图的其余部分.你可能想要设置整个menuButton内部框架viewDidLayoutSubviews而不是origin.y像我一样,特别是如果你需要支持旋转/横向模式.在这个非常简单的例子中,更新origin.y就足够了.