我的 UIButtonBarItem 没有使用 FlexibleSpace 正确布局

My UIButtonBarItem 's don't properly lay out with FlexibleSpace

我正在以编程方式在 swift 中创建 UIToolBar 及其项目:

    var items = [UIBarButtonItem]()
    let leftButton  = UIBarButtonItem(image: UIImage(named: "left"), style: .Plain, target: self, action: Selector("doneClickedMaButton"))
    let spacer      = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
    let rightButton = UIBarButtonItem(image: UIImage(named: "right"), style: .Plain, target: self, action: Selector("doneClickedRight"))
    let searchButton = UIBarButtonItem(barButtonSystemItem: .Search, target: self, action: Selector("doneClickedSearch"))
    items.append(leftButton)
    items.append(spacer)
    items.append(searchButton)
    items.append(spacer)        
    items.append(rightButton)

var toolBar         = UIToolbar()
    toolBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 50)
    toolBar.translatesAutoresizingMaskIntoConstraints = false
    toolBar.backgroundColor = UIColor.redColor()
    toolBar.items = items
    toolBar.sizeToFit()
    view.addSubview(toolBar)
    view.addConstraint(NSLayoutConstraint(item: toolBar, attribute: .Bottom, relatedBy: .Equal, toItem: view, attribute: .Bottom, multiplier: 1.0, constant: 0.0))

如果我不添加 spacer 项目,那么模拟器看起来像这样:

如果我确实有它们,就像这段代码中所说的那样。我明白了:

正如您在此处看到的那样,现在不仅图像向左从屏幕上脱落,而且它们的顺序也不再正确。

我以为 .FlexibleSpace 只是在项目之间添加动态间距。我在这里错过了什么吗?有人在各种帖子中提到,可以在 UIBarButtonItem 中为 UILabel 设置宽度,这可以使 .FlexibleSpace 识别它。

问题是您没有足够的约束来满足自动布局引擎。您将工具栏固定在底部,但宽度正在缩小,因此它只能容纳按钮,但您希望它是视图的宽度。尝试类似的东西:

var items = [UIBarButtonItem]()
    let leftButton  = UIBarButtonItem(image: UIImage(named: "left"), style: .Plain, target: self, action: Selector("doneClickedMaButton"))
    let spacer      = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
    let rightButton = UIBarButtonItem(image: UIImage(named: "right"), style: .Plain, target: self, action: Selector("doneClickedRight"))
    let searchButton = UIBarButtonItem(barButtonSystemItem: .Search, target: self, action: Selector("doneClickedSearch"))
    items.append(leftButton)
    items.append(spacer)
    items.append(searchButton)
    items.append(spacer)        
    items.append(rightButton)

var toolBar         = UIToolbar()
    toolBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 50)
    toolBar.translatesAutoresizingMaskIntoConstraints = false
    toolBar.backgroundColor = UIColor.redColor()
    toolBar.items = items
    toolBar.sizeToFit()
    view.addSubview(toolBar)
    toolBar.leadingAnchor.constraintEqualToAnchor(self.view.leadingAnchor).active = true
    toolBar.trailingAnchor.constraintEqualToAnchor(self.view.trailingAnchor).active = true
    toolBar.bottomAnchor.constraintEqualToAnchor(self.view.bottomAnchor).active = true