在我的应用中,我有一个UIBarButtonItems
的工具栏
在大多数情况下,UIBarButtonItems
是通过故事板设置的,如下所示:
在特殊情况下,我必须以编程方式替换一个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显示在工具栏中时,它会放置在不同的位置。它向右移动,如您所见:
如何将UIBarButtonItems
置于同一位置?
修改
到目前为止,我意识到编程创建的UIBarButtonItem
的水平移动并不总是相同,没有对代码进行任何更改:有时它向左移动,而不是向右移动:
编辑2:
我找到了一个解决方法:
如果我将宽度约束设置为我的按钮,如
rotatingButton.widthAnchor.constraint(equalToConstant: 40).isActive = true
然后按钮显然总是正确放置。但我讨厌像这样强制编码约束。
有更优雅的方式吗?
答案 0 :(得分:0)
尝试以下步骤执行任务:
NSMutableArray
UIBarbuttonItem
希望这些步骤能够正常工作
答案 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)
}
}