我在IB中创建了一个带有多个按钮的工具栏。我希望能够根据主窗口中数据的状态来隐藏/显示其中一个按钮。
UIBarButtonItem
没有隐藏属性,目前我找到的任何关于隐藏它们的示例都涉及将导航栏按钮设置为nil,在这里我认为不需要这样做,因为我可能需要再次显示按钮(更不用说,如果我将我的按钮连接到IBOutlet,如果我将其设置为nil,我不确定如何重新获取它)。
我在IB中创建了一个带有多个按钮的工具栏。我希望能够根据主窗口中数据的状态来隐藏/显示其中一个按钮。
UIBarButtonItem
没有隐藏属性,目前我找到的任何关于隐藏它们的示例都涉及将导航栏按钮设置为nil,在这里我认为不需要这样做,因为我可能需要再次显示按钮(更不用说,如果我将我的按钮连接到IBOutlet,如果我将其设置为nil,我不确定如何重新获取它)。
我发现在Max和其他人建议的tintColor
和isEnabled
方法中又有了一个小问题——当开启辅助功能的VoiceOver并且逻辑上隐藏了该按钮时,辅助功能光标仍会聚焦于该条形按钮,并且说明它是“已禁用”(因为isEnabled
被设为假)。被采纳的答案中的方法不会出现这种副作用,但我找到的另一个解决方法是当“隐藏”该按钮时将isAccessibilityElement
设为假:
deleteButton.tintColor = UIColor.clear
deleteButton.isEnabled = false
deleteButton.isAccessibilityElement = false
当“显示”按钮时,将isAccessibilityElement
重新设置为true:
deleteButton.tintColor = UIColor.blue
deleteButton.isEnabled = true
deleteButton.isAccessibilityElement = true
在我的情况下,保留标准按钮项的空间并不是问题,因为我们隐藏/显示了最左边或最右边的按钮项。
如果您在 Swift 中使用 UIBarButtonItem 并且在 AppDelegate 中设置了一些设计相关的属性,比如字体大小,请不要更新 tintColor
,因为这会完全改变按钮显示时的外观。
对于文本按钮,更改标题可能会导致按钮“消失”。
if WANT_TO_SHOW {
myBarButtonItem.enabled = true
myBarButtonItem.title = "BUTTON_NAME"
}else{
myBarButtonItem.enabled = false
myBarButtonItem.title = ""
}
extension UIBarButtonItem {
var isHidden: Bool {
get {
return tintColor == .clear
}
set {
tintColor = newValue ? .clear : .white //or whatever color you want
isEnabled = !newValue
isAccessibilityElement = !newValue
}
}
}
使用方法:
myBarButtonItem.isHidden = true
@IBDesignable class AttributedBarButtonItem: UIBarButtonItem {
var isHidden: Bool = false {
didSet {
isEnabled = !isHidden
tintColor = isHidden ? UIColor.clear : UIColor.black
}
}
}
现在只需更改isHidden
属性即可。
改进自@lnafziger的答案
将您的Barbuttons保存在一个强大的outlet中,然后执行以下操作以隐藏/显示它:
-(void) hideBarButtonItem :(UIBarButtonItem *)myButton {
// Get the reference to the current toolbar buttons
NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy];
// This is how you remove the button from the toolbar and animate it
[navBarBtns removeObject:myButton];
[self.navigationItem setRightBarButtonItems:navBarBtns animated:YES];
}
-(void) showBarButtonItem :(UIBarButtonItem *)myButton {
// Get the reference to the current toolbar buttons
NSMutableArray *navBarBtns = [self.navigationItem.rightBarButtonItems mutableCopy];
// This is how you add the button to the toolbar and animate it
if (![navBarBtns containsObject:myButton]) {
[navBarBtns addObject:myButton];
[self.navigationItem setRightBarButtonItems:navBarBtns animated:YES];
}
}
每当需要时,请使用以下函数。
[self showBarButtonItem:self.rightBarBtn1];
[self hideBarButtonItem:self.rightBarBtn1];
只需要设置barButton.customView = UIView()
,就能看到效果
func hideToolbarItem(button: UIBarButtonItem, withToolbar toolbar: UIToolbar) {
var toolbarButtons: [UIBarButtonItem] = toolbar.items!
toolbarButtons.removeAtIndex(toolbarButtons.indexOf(button)!)
toolbar.setItems(toolbarButtons, animated: true)
}
func showToolbarItem(button: UIBarButtonItem, inToolbar toolbar: UIToolbar, atIndex index: Int) {
var toolbarButtons: [UIBarButtonItem] = toolbar.items!
if !toolbarButtons.contains(button) {
toolbarButtons.insert(button, atIndex: index)
toolbar.setItems(toolbarButtons, animated:true);
}
}
func hideToolbarItem(button: UIBarButtonItem, withToolbar toolbar: UINavigationItem) {
var toolbarButtons: [UIBarButtonItem] = toolbar.rightBarButtonItems!
toolbarButtons.removeAtIndex(toolbarButtons.indexOf(button)!)
toolbar.setRightBarButtonItems(toolbarButtons, animated: true)
}
这样就可以正常工作了。 - Kingalione无法“隐藏”UIBarButtonItem,您必须将其从superView中删除,并在需要显示它时将其添加回去。
initWithCustomView:(UIView *)
属性分配UIBarButtonItem
。UIView
的子类将具有隐藏/显示属性。UIButton
。
2. 将UIButton
作为自定义视图。例如:UIButton*myButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];//your button
UIBarButtonItem*yourBarButton=[[UIBarButtonItem alloc] initWithCustomView:myButton];
3. 您可以隐藏/显示您创建的myButton
。 [myButton setHidden:YES];
最终,从开始,UIBarButtonItem
有了isHidden
属性。
因此,为了进一步完善现有答案,可以这样:
extension UIBarButtonItem {
func show() {
if #available(iOS 16.0, *) {
isHidden = false
} else {
isEnabled = true
tintColor = .white
}
}
func hide() {
if #available(iOS 16.0, *) {
isHidden = true
} else {
isEnabled = false
tintColor = .clear
}
}
}