Answers:
将按钮保存在功能强大的插座中(我们称之为myButton
),然后执行以下操作来添加/删除它:
// Get the reference to the current toolbar buttons
NSMutableArray *toolbarButtons = [self.toolbarItems mutableCopy];
// This is how you remove the button from the toolbar and animate it
[toolbarButtons removeObject:self.myButton];
[self setToolbarItems:toolbarButtons animated:YES];
// This is how you add the button to the toolbar and animate it
if (![toolbarButtons containsObject:self.myButton]) {
// The following line adds the object to the end of the array.
// If you want to add the button somewhere else, use the `insertObject:atIndex:`
// method instead of the `addObject` method.
[toolbarButtons addObject:self.myButton];
[self setToolbarItems:toolbarButtons animated:YES];
}
因为它存储在插座中,所以即使它不在工具栏上,您也将对其进行引用。
我知道这个问题迟到了。但是,如果其他人也遇到类似的情况,这可能会有所帮助。
在iOS 7中,要隐藏条形按钮项,我们可以使用以下两种技术:
SetTitleTextAttributes
:-这对“完成”,“保存”等条形按钮项目效果很好。但是,对于诸如“添加”,“废纸symbol”符号等项目(至少对我来说不是),它不起作用,因为它们不是文本。TintColor
:-如果我有一个名为“ deleteButton”的条按钮项:-为了隐藏按钮,我使用了以下代码:-
[self.deleteButton setEnabled:NO];
[self.deleteButton setTintColor: [UIColor clearColor]];
为了再次显示该按钮,我使用了以下代码:
[self.deleteButton setEnabled:YES];
[self.deleteButton setTintColor:nil];
deleteButton.enabled = false; deleteButton.tintColor = UIColor.clearColor()
禁用和隐藏,然后deleteButton.enabled = true; deleteButton.tintColor = nil
重新启用并正常显示。
UIColor.clear
为,UIControlState.disabled
并可以使用显示/隐藏按钮setEnabled
。当然,正如您所说,这仅适用于文本按钮。
这是一个简单的方法:
hide: barbuttonItem.width = 0.01;
show: barbuttonItem.width = 0; //(0 defaults to normal button width, which is the width of the text)
我只是在视网膜iPad上运行它,而.01很小,无法显示。
self.window?.tintColor = APP_PRIMARY_COLOR
在appdelegate中使用此行设置了全局色,则将无法使用
可以将按钮隐藏在适当的位置,而无需更改按钮的宽度或将其从工具栏中删除。如果将样式设置为纯色,请删除标题并禁用按钮,该按钮将消失。要还原它,只需撤消更改即可。
-(void)toggleBarButton:(bool)show
{
if (show) {
btn.style = UIBarButtonItemStyleBordered;
btn.enabled = true;
btn.title = @"MyTitle";
} else {
btn.style = UIBarButtonItemStylePlain;
btn.enabled = false;
btn.title = nil;
}
}
以下是我的解决方案,尽管我一直在寻找导航栏。
navBar.topItem.rightBarButtonItem = nil;
在这里,“ navBar”是XIB视图中NavigationBar的IBOutlet。在这里,我想隐藏按钮或根据某些条件显示按钮。因此,即时通讯测试条件是否为“ If”,如果为true,则在目标视图的viewDidLoad方法中将按钮设置为nil。
这可能与您的问题不完全相关,但是如果您想隐藏NavigationBar上的按钮,则可能类似
rightBarButtonItem
再次设置,请确保将按钮项存储在功能强大的 IBOutlet中,以便从导航栏上取下按钮时不会将其释放。
对于Swift 3和Swift 4,您可以执行以下操作以隐藏UIBarButtomItem
:
self.deleteButton.isEnabled = false
self.deleteButton.tintColor = UIColor.clear
并显示UIBarButtonItem
:
self.deleteButton.isEnabled = true
self.deleteButton.tintColor = UIColor.blue
在上,tintColor
您必须指定要用于UIBarButtomItem
我目前正在运行针对iOS 7.1的OS X Yosemite Developer Preview 7和Xcode 6 beta 6,以下解决方案对我来说效果很好:
UINavigationItem
和UIBarButtonItem
小号运行以下代码删除
[self.navItem setRightBarButtonItem:nil];
[self.navItem setLeftBarButtonItem:nil];
运行以下代码以再次添加按钮
[self.navItem setRightBarButtonItem:deleteItem];
[self.navItem setLeftBarButtonItem:addItem];
self.dismissButton.customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
iOS 8.具有自定义图像的UIBarButtonItem。尝试了许多不同的方法,但大多数方法都无济于事。马克斯的解决方案setTintColor
没有改变为任何颜色。我自己想出了一个,认为对某些人有用。
对于隐藏:
[self.navigationItem.rightBarButtonItem setEnabled:NO];
[self.navigationItem.rightBarButtonItem setImage:nil];
用于显示:
[self.navigationItem.rightBarButtonItem setEnabled:YES];
[self.navigationItem.rightBarButtonItem setImage:image];
我在tintColor
和中发现了另一个皱纹isEnabled
马克斯等人的做法建议-当VoiceOver会为辅助功能启用,并且按钮逻辑隐藏,无障碍光标也将重点放在栏按钮,并指出它是“灰色”(即由于isEnabled
IS设置为false)。可接受的答案中的方法没有这种副作用,但是我发现的另一种解决方法是isAccessibilityElement
在“隐藏”按钮时将其设置为false:
deleteButton.tintColor = UIColor.clear
deleteButton.isEnabled = false
deleteButton.isAccessibilityElement = false
然后isAccessibilityElement
在“显示”按钮时将其设置回true:
deleteButton.tintColor = UIColor.blue
deleteButton.isEnabled = true
deleteButton.isAccessibilityElement = true
在我的情况下,让bar按钮项仍然占据空间并不是问题,因为我们要隐藏/显示最右边的bar按钮项。
@IBDesignable class AttributedBarButtonItem: UIBarButtonItem {
var isHidden: Bool = false {
didSet {
isEnabled = !isHidden
tintColor = isHidden ? UIColor.clear : UIColor.black
}
}
}
现在只需更改isHidden
属性。
来自@lnafziger的改进答案
将Barbuttons保存在坚固的插座中,然后执行以下操作以隐藏/显示它:
-(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()
并查看技巧
无法“隐藏” UIBarButtonItem,必须将其从superView中删除,然后在想要再次显示时将其重新添加。
这在答案列表中还有很长的路要走,但是如果有人想要简单的复制和粘贴快速解决方案,这就是
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);
}
}
一种方法是initWithCustomView:(UIView *)
在分配时使用 属性UIBarButtonItem
。的子类UIView
将具有隐藏/取消隐藏属性。
例如:
1.有一个UIButton
您要隐藏/取消隐藏的对象。
2.将UIButton
作为自定义视图。喜欢 :
UIButton*myButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];//your button
UIBarButtonItem*yourBarButton=[[UIBarButtonItem alloc] initWithCustomView:myButton];
3.您可以隐藏/取消隐藏myButton
您创建的内容。[myButton setHidden:YES];
对于Swift版本,下面是代码:
对于UINavigationBar
:
self.navigationItem.rightBarButtonItem = nil
self.navigationItem.leftBarButtonItem = nil
禁用条形按钮项时,将文本颜色设置为纯色可能是一种更干净的选择。您不必在评论中进行解释就很奇怪。同样,您不破坏按钮,因此仍保留所有关联的故事板脚本。
[self.navigationItem.rightBarButtonItem setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor clearColor]}
forState:UIControlStateDisabled];
然后,无论何时要隐藏条形按钮项,都可以执行以下操作:
self.navigationItem.rightBarButton.enabled = NO;
la脚的是没有隐藏的属性,但这提供了相同的结果。
如果UIBarButtonItem具有图像而不是文本,则可以将其隐藏:
navigationBar.topItem.rightBarButtonItem.customView.alpha = 0.0;
我认为我会根据lnafziger接受的答案分享一些帮助方法,因为我每个人都有多个工具栏和多个按钮:
-(void) hideToolbarItem:(UIBarButtonItem*) button inToolbar:(UIToolbar*) toolbar{
NSMutableArray *toolbarButtons = [toolbar.items mutableCopy];
[toolbarButtons removeObject:button];
[toolbar setItems:toolbarButtons animated:NO];
}
-(void) showToolbarItem:(UIBarButtonItem*) button inToolbar:(UIToolbar*) toolbar atIndex:(int) index{
NSMutableArray *toolbarButtons = [toolbar.items mutableCopy];
if (![toolbarButtons containsObject:button]){
[toolbarButtons insertObject:button atIndex:index];
[self setToolbarItems:toolbarButtons animated:YES];
}
}
您可以轻松地获取视图并将其隐藏
let view: UIView = barButtonItem.valueForKey("view") as! UIView
view.hidden = true
如果您使用的是Swift 3
if (ShowCondition){
self.navigationItem.rightBarButtonItem = self.addAsset_btn
}
else {
self.navigationItem.rightBarButtonItem = nil
}
作为对Eli Burke的回应的补充,如果您UIBarButtonItem
有背景图片而不是标题,则可以使用以下代码:
-(void)toggleLogoutButton:(bool)show{
if (show) {
self.tabButton.style = UIBarButtonItemStyleBordered;
self.tabButton.enabled = true;
UIImage* imageMap = [UIImage imageNamed:@"btn_img.png"];
[((UIButton *)[self.tabButton customView]) setBackgroundImage:imageMap forState:UIControlStateNormal];
} else {
self.tabButton.style = UIBarButtonItemStylePlain;
self.tabButton.enabled = false;
[((UIButton *)[self.tabButton customView]) setBackgroundImage:nil forState:UIControlStateNormal];
}
}
您需要操纵toolbar.items数组。
这是一些我用来隐藏和显示“完成”按钮的代码。如果您的按钮位于工具栏的最边缘或其他按钮之间,则其他按钮也会移动,因此,如果您希望按钮不显示,则将其作为最后一个按钮移向中间。我为按钮移动设置动画效果,我很喜欢。
-(void)initLibraryToolbar {
libraryToolbarDocumentManagementEnabled = [NSMutableArray arrayWithCapacity:self.libraryToolbar.items.count];
libraryToolbarDocumentManagementDisabled = [NSMutableArray arrayWithCapacity:self.libraryToolbar.items.count];
[libraryToolbarDocumentManagementEnabled addObjectsFromArray:self.libraryToolbar.items];
[libraryToolbarDocumentManagementDisabled addObjectsFromArray:self.libraryToolbar.items];
trashCan = [libraryToolbarDocumentManagementDisabled objectAtIndex:3];
mail = [libraryToolbarDocumentManagementDisabled objectAtIndex:5];
[libraryToolbarDocumentManagementDisabled removeObjectAtIndex:1];
trashCan.enabled = NO;
mail.enabled = NO;
[self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:NO];
}
所以现在可以使用以下代码显示您的按钮
[self.libraryToolbar setItems:libraryToolbarDocumentManagementEnabled animated:YES];
trashCan.enabled = YES;
mail.enabled = YES;
或隐藏您的按钮
[self.libraryToolbar setItems:libraryToolbarDocumentManagementDisabled animated:YES];
trashCan.enabled = NO;
mail.enabled = NO;
归功于@ lnafziger,@ MindSpiker,@ vishal等。等等
我为单个右(或左)条按钮获得的最简单的衬板是:
self.navigationItem.rightBarButtonItem = <#StateExpression#>
? <#StrongPropertyButton#> : nil;
如:
@interface MyClass()
@property (strong, nonatomic) IBOutlet UIBarButtonItem *<#StrongPropertyButton#>;
@end
@implementation
- (void) updateState
{
self.navigationItem.rightBarButtonItem = <#StateExpression#>
? <#StrongPropertyButton#> : nil;
}
@end
我对此进行了测试,并对其进行了测试(通过IB连接了坚固的按钮按钮)。