UIBarButtonItem - 全宽没有灵活空间

Posted

技术标签:

【中文标题】UIBarButtonItem - 全宽没有灵活空间【英文标题】:UIBarButtonItem - full width without flexible space 【发布时间】:2016-06-30 19:07:31 【问题描述】:

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

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

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

如何使 UIBarButtonItem 全宽?

【问题讨论】:

您可以将相同的点击操作添加到灵活空间。或者只是用相等的前导/训练空格填充“创建集”字符串。 @thelaws 将已发送的操作添加到灵活空间是个好主意!但是,当我尝试通过情节提要实现它时,它似乎不起作用。 【参考方案1】:

当您将宽度为0(自动宽度计算)的UIBarButtonItem 添加到情节提要中的UIToolBar 并打印出它的视图框架时,您可以看到它是原点。 x 值为 12.0。当您将其宽度更改为特定的值(而不是自动计算宽度)并再次检查框架时,您可以看到它的 origin.x 值为 20.0

由于您必须手动设置宽度,我们将使用 20.0 的值。

当您将两个UIBarButtonItems 添加到情节提要中的UIToolBar 并打印出它们的视图框架时,您可以看到它们之间存在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)")
    

【讨论】:

以上是关于UIBarButtonItem - 全宽没有灵活空间的主要内容,如果未能解决你的问题,请参考以下文章

带有customView的自动布局iOS 11工具栏UIBarButtonItem

带有 UIImage 的 UIBarButtonItem 太宽

添加/删除其他 UIBarbuttons 时如何保持 UIBarButtonItem 居中?

UIToolbar UIBarButtonItem 对齐问题

视频没有全宽显示

jQuery 数据表标题没有占用全宽