通过故事板与编程方式放置时,UIBarButtonItem位置不同

时间:2017-12-09 12:22:21

标签: ios autolayout uibarbuttonitem

在我的应用中,我有一个UIBarButtonItems的工具栏 在大多数情况下,UIBarButtonItems是通过故事板设置的,如下所示:

enter image description here

在特殊情况下,我必须以编程方式替换一个UIBarButtonItem。这是通过以下代码完成的:

let rotatingButton = UIButton(type: .custom)
rotatingButton.setImage(UIImage(named: "LocalizationInUseNoFix"), for: .normal)
rotatingButton.addTarget(self, action: #selector(localizationButtonTapped), for: .touchUpInside)
rotatingButton.rotateStart()
let barButtonItem = UIBarButtonItem(customView: rotatingButton)
leftBarButtonItems![2] = barButtonItem

当rotateButton显示在工具栏中时,它会放置在不同的位置。它向右移动,如您所见:

enter image description here

如何将UIBarButtonItems置于同一位置?

修改
到目前为止,我意识到编程创建的UIBarButtonItem的水平移动并不总是相同,没有对代码进行任何更改:有时它向左移动,而不是向右移动:

enter image description here

编辑2:
我找到了一个解决方法:
如果我将宽度约束设置为我的按钮,如

rotatingButton.widthAnchor.constraint(equalToConstant: 40).isActive = true

然后按钮显然总是正确放置。但我讨厌像这样强制编码约束。
有更优雅的方式吗?

5 个答案:

答案 0 :(得分:0)

尝试以下步骤执行任务:

  1. 将左侧栏按钮项目存储到NSMutableArray
  2. 替换所需的UIBarbuttonItem
  3. 将leftbarbuttonitems设置为此新数组
  4. 希望这些步骤能够正常工作

答案 1 :(得分:0)

当您以编程方式在UIBarButton上设置图像时,leftBarButtonItems的contentmode变为'left'而rightBarButtonItems变为'right'。但是从故事板开始,它就是中心。设置图像并根据需要调整contentMode。

答案 2 :(得分:0)

所有这些都适用于导航栏和工具栏

类ViewController:UIViewController {

$query = "SELECT *
FROM `CUSTOMER` AS c
INNER JOIN `SALE` AS s ON c.user_id = s.user_id
INNER JOIN `PRODUCTS` AS p ON p.product_id = s.product_id
WHERE c.user_id = {$tid}";

}

答案 3 :(得分:0)

这是我到目前为止找到的最佳解决方案:

使用键值编码获取另一个条形按钮项的视图宽度。这是来自Jeremy W. Sherman的回答here 请注意,它不使用任何私有API,请参阅那里的讨论。可能发生的最糟糕的事情是无法访问view的{​​{1}}属性。在这种情况下,我使用默认值:

UIBarButtonItem

答案 4 :(得分:0)

This is working fine for me. Best way is identify item to replace and change the content    

@IBAction func changeLeftItems(_ sender: Any) {
            if let items = self.toolbar.items {
                var addItems = [UIBarButtonItem]()
                addItems.append(contentsOf: items)
                let barItem = UIBarButtonItem(title: "L5", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ViewController.leftAction(_:)))
                addItems.remove(at: 1)
                addItems.insert(barItem, at: 1)
                self.toolbar.setItems(addItems, animated: true)
            }
        }