如何在代码中更改 UIBarButtonItem 的样式

Posted

技术标签:

【中文标题】如何在代码中更改 UIBarButtonItem 的样式【英文标题】:How can i change the style of UIBarButtonItem in code 【发布时间】:2012-01-05 08:52:17 【问题描述】:

我正在使用 UIBarButtonSystemItemPlay 播放我的音频文件,我想在单击它时动态更改它的样式。有可能吗?如果可以,请帮助我。这是我的代码,其中 _playPause 是 UIBarButtonSystemItemPlay 的 IBOutlet。提前致谢。

- (IBAction)playPause:(UIBarButtonItem *) sender

    if (_playPause.style == UIBarButtonSystemItemPlay)
    
        [_playPause setStyle:UIBarButtonSystemItemPause];
        [audio play];
    
    else
    
        [_playPause setStyle:UIBarButtonSystemItemPlay];
        [audio pause];
    

【问题讨论】:

您是否尝试过使用== 而不是= ?...无论如何我会使用 ivar bool 标志来检查音频是否正在播放。 哦,对不起!非常感谢,我会检查一下,稍后再找你。 我查过了,还是不行。 UIBarButtonSystemItem 无法通过 style 属性检索。 style 的类型为 UIBarButtonItemStyle UIBarButtonItem 必须使用[此答案中描述的方法][1] 替换。 [1]:***.com/questions/1078597/… 【参考方案1】:

样式属性无法检索UIBarButtonSystemItemPlayUIBarButtonSystemItemPause。样式的类型为UIBarButtonItemStyle

查看文档here。

我建议创建两个不同的UIBarButtonItem,然后交替启用或禁用(例如)它们。也可以移除当前可见按钮并添加一个具有不同UIBarButtonSystemItem 的新按钮。

【讨论】:

【参考方案2】:

这是我刚刚实现的一个非常完整的解决方案:

首先,定义 vars 来按住两个按钮:

@property (weak, nonatomic) IBOutlet UIToolbar *toolbar;
@property (strong, nonatomic) IBOutlet UIBarButtonItem *playButton;
@property (strong, nonatomic) IBOutlet UIBarButtonItem *pauseButton;

(我在这里的理解是工具栏是一个弱引用,因为它是通过 IB 定义的,并且它有一个强指针,但是播放/暂停按钮是强指针,因为我们在下面创建它们。但是我的作为一个新手,fu 在这方面有点弱,所以更正感激。)

其次,在 IB 中只创建一个播放按钮(没有暂停按钮)并将其绑定到上面的 playButton var。

三、设置这个方法:

- (void) setAsPlaying:(BOOL)isPlaying

    self.rootViewController.playing = isPlaying;

    // we need to change which of play/pause buttons are showing, if the one to
    // reverse current action isn't showing
    if ((isPlaying && !self.pauseButton) || (!isPlaying && !self.playButton))
    
        UIBarButtonItem *buttonToRemove = nil;
        UIBarButtonItem *buttonToAdd = nil;
        if (isPlaying)
        
            buttonToRemove = self.playButton;
            self.playButton = nil;
            self.pauseButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPause
                                                                             target:self
                                                                             action:@selector(pauseAudio:)];
            buttonToAdd = self.pauseButton;
        
        else
        
            buttonToRemove = self.pauseButton;
            self.pauseButton = nil;
            self.playButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPlay
                                                                            target:self
                                                                            action:@selector(playAudio:)];
            buttonToAdd = self.playButton;
        

        // Get the reference to the current toolbar buttons
        NSMutableArray *toolbarButtons = [[self.toolbar items] mutableCopy];

        // Remove a button from the toolbar and add the other one
        if (buttonToRemove)
            [toolbarButtons removeObject:buttonToRemove];
        if (![toolbarButtons containsObject:buttonToAdd])
            [toolbarButtons insertObject:buttonToAdd atIndex:2];    // vary this index to put in diff spots in toolbar

        [self.toolbar setItems:toolbarButtons];
    

第四,无论您要播放还是暂停模式,都调用 setAsPlaying。例如:

-(IBAction) playAudio:(id)sender

    [self.audioPlayer play];
    [self setAsPlaying:YES];


-(IBAction) pauseAudio:(id)sender

    [self.audioPlayer pause];
    [self setAsPlaying:NO];

【讨论】:

另外,您不需要使用strong 属性,因为无论如何您都在重新实例化UIBarButtonItem。您可以在方法中使用本地 UIBarButtonItem 变量和 weak 属性。 你可以通过NSInteger index = [toolbarButtons indexOfObject:buttonToRemove]然后[toobarButtons replaceObjectAtIndex:index withObject:buttonToAdd]来动态检索要删除的按钮索引【参考方案3】:

我相信一旦最初设置了样式(即在界面构建器中或在代码中创建按钮时),您就无法更改它。

您唯一的其他选择是删除代码中的按钮并使用不同的样式在其位置创建一个新按钮。你可以调用这个方法:

- (id)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action

有关UIBarButtonItem 的更多信息,请查看this。

【讨论】:

【参考方案4】:

是的,“样式”一旦设置就无法更改(实际上并不称为样式)。

是的,您可以制作另一个按钮来修复它。

下面是可重复使用的代码:

UIBarButtonItem *newButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
    target:controller.navigationItem.rightBarButtonItem.target
    action:controller.navigationItem.rightBarButtonItem.action];
controller.navigationItem.rightBarButtonItem = newButton;

这里,控制器通常是self

【讨论】:

以上是关于如何在代码中更改 UIBarButtonItem 的样式的主要内容,如果未能解决你的问题,请参考以下文章

如何在返回箭头中更改 UIBarButtonItem?

如何用IB改变UIBarButtonItem的宽度

快速更改 UINavigationBar 中 UIBarButtonItem 的宽度

在 iOS 8.2 上更改 UIBarButtonItem 的垂直位置

在swift中更改UINavigationBar中UIBarButtonItem的宽度

从 UIBarButtonItem 呈现方向更改后,如何防止 UIPopoverController passthroughViews 被重置?