UIBarButtonItem - 没有灵活空间的全宽

时间:2016-06-30 19:07:32

标签: ios objective-c storyboard uinavigationbar uibarbuttonitem

我的屏幕底部有一个UIBarButtonItem,我希望它是全宽的,这样如果用户点击导航栏中的任意位置,按钮就会被触发。

目前,由于两侧都有灵活的空间,用户需要专门点击中心的“创建设置”按钮才能触发按钮。

enter image description here

但是,当我删除灵活空间时,我没有看到文本居中和全宽的直接方式。

如何制作UIBarButtonItem全宽?

1 个答案:

答案 0 :(得分:0)

将宽度为 0 UIBarButtonItem(自动宽度计算)添加到故事板中的UIToolBar并打印出来的视图&#39;您可以看到它的 origin.x 12.0 。当您将宽度更改为特定的宽度(而不是自动宽度计算)并再次检查框架时,您可以看到它的 origin.x 20.0 < /强>

因为在您的情况下您必须手动设置宽度,我们将使用 20.0 的值。

将两个UIBarButtonItems添加到故事板中的UIToolBar并打印出他们的观看次数&#39;你可以看到它们之间存在 10.0 点的空间。

记住这些值时,您可以执行以下操作:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let item = UIBarButtonItem(title: "create set", style: .Plain, target: nil, action: nil)
    setupToolbarWithItems([item], animated: true)

    printToolbarFrames()
}

private func setupToolbarWithItems(items: [UIBarButtonItem], animated: Bool) {
    guard let toolbar = navigationController?.toolbar else {
        print("there is no toolbar")
        return
    }

    if items.isEmpty {
        setToolbarItems(nil, animated: animated)
        return
    }

    // change item widths to specific size for correct calculation
    for item in items {
        item.width = 44
    }

    setToolbarItems(items, animated: animated)

    // calculate margin and innerItemSpace
    let firstView = items.first?.valueForKey("view") as! UIView
    let margin = firstView.frame.origin.x
    var innerItemSpace = CGFloat(0)
    if items.count > 1 {
        let secondView = items[1].valueForKey("view") as! UIView
        innerItemSpace = secondView.frame.origin.x - (firstView.frame.origin.x + firstView.frame.size.width)
    }

    // calculate and set correct itemWidth for each item
    let toolbarWidth = toolbar.frame.size.width
    let availableToolbarSpace = toolbarWidth - 2 * margin - (CGFloat(items.count) - 1) * innerItemSpace
    let itemWidth = floor(availableToolbarSpace / CGFloat(items.count))

    for item in items {
        item.width = itemWidth
    }
}

希望它有所帮助:)

修改

这是另一个帮助函数,用于在使用setupToolbarWithItems方法后打印出相关的工具栏框架:

private func printToolbarFrames() {
    guard let toolbar = navigationController?.toolbar else {
        print("there is no toolbar")
        return
    }

    print("toolbar frame: \(toolbar.frame)")
    guard let items = toolbar.items else {
        print("there are no items on the toolbar")
        return
    }

    for item in items {
        let view = item.valueForKey("view") as! UIView
        print("item: \(item.title!), frame: \(view.frame)")
    }
}