当您将宽度为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)")
}
}