将 UiBarButtonItem 上的 UIImage 从标识符更新为图像

Posted

技术标签:

【中文标题】将 UiBarButtonItem 上的 UIImage 从标识符更新为图像【英文标题】:Updating UIImage on UiBarButtonItem from identifier to image 【发布时间】:2013-08-06 09:43:34 【问题描述】:

我目前正在为 ios 申请,但我在更改图像时遇到了麻烦……真可惜……

情况是这样的: 我有一个包含我的项目的工具栏,其中一项是从标识符“播放”创建的播放按钮。所以我的播放按钮没有问题。现在我只想在单击项目然后再次切换等时将其更改为暂停图像。 所以我喜欢在我的 .h 中给我的项目:

@property (weak, nonatomic) IBOutlet UIBarButtonItem *play;

我尝试了很多我在这个网站上找到的答案,但没有一个对我的案例有用:/ 我尝试的最后一个是这样的:

UIButton *button1=[UIButton buttonWithType:UIButtonTypeCustom];
[button1 setFrame:CGRectMake(10.0, 2.0, 45.0, 40.0)];
[button1 addTarget:self action:@selector(showLeft:) forControlEvents:UIControlEventTouchUpInside];
[button1 setImage:[UIImage imageNamed:@"pause.png"] forState:UIControlStateNormal];
UIBarButtonItem *button = [[UIBarButtonItem alloc]initWithCustomView:button1];
self.play = button;

我也试过了:

self.play.customView = button1;

但它们都没有真正起作用,我可以通过做得到图像

self.view = button1;

但是只有画面中间的图片(所以 UIImage 的创建是可以的)所以....

(如果您还可以告诉我如何使用标识符返回游戏,那也会非常有帮助,非常感谢)

感谢您的帮助。

【问题讨论】:

您是否尝试过将按钮的 customView 属性更改为带有暂停图像的视图? 好吧,我建议使用基于不同状态的图像。为 UIControlStateNormal 设置一个图像,并为其分配播放按钮并为 UIControlStateSelected 设置另一个图像并分配暂停按钮。每当单击按钮时,使用这样的简单规则切换按钮的状态; button.selected = !button.selected 我希望这能解决你的问题。 【参考方案1】:

如果按钮已经创建并且你有一个出口,你可以简单地像这样设置它:

UIImage* backgroundImage = [UIImage yourImage];
[self.barButtonItem setImage:backgroundImage];

像魅力一样工作。

【讨论】:

【参考方案2】:

我认为这应该可行。

-(IBAction)buttonClick:(UIBarButtonItem *)sender 

    if ([[sender backgroundImageForState:UIControlStateNormal barMetrics:UIBarMetricsDefault] isEqual:[UIImage imageNamed:@"Play.jpg"]]) 
        [sender setBackgroundImage:[UIImage imageNamed:@"Pause.jpg"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    else
        [sender setBackgroundImage:[UIImage imageNamed:@"Play.jpg"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    

当然,您必须首先将背景图像(在 viewDidLoad 中)设置为“播放”图像才能正常工作。

编辑后:

如果你想使用系统播放和暂停按钮,据我所知,你必须更换按钮。我认为没有办法只改变图像。所以,我是这样做的。该按钮是在 IB 中使用插座 playPauseButton 和动作 playClick 设置的。我还为工具栏(toolBar)做了一个出口。

-(IBAction)playClick:(UIBarButtonItem *)sender 
    UIBarButtonItem *pause = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPause target:self action:@selector(pauseClick:)];
    NSMutableArray *tbItems = [self.toolBar.items mutableCopy];
    [tbItems removeObject:self.playPauseButton];
    self.playPauseButton = pause;
    [tbItems addObject:pause];
    self.toolBar.items = tbItems;


-(void)pauseClick:(UIBarButtonItem *)sender 
    UIBarButtonItem *play = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPlay target:self action:@selector(playClick:)];
    NSMutableArray *tbItems = [self.toolBar.items mutableCopy];
    [tbItems removeObject:self.playPauseButton];
    self.playPauseButton = play;
    [tbItems addObject:play];
    self.toolBar.items = tbItems;

【讨论】:

我的实际问题是我想通过在 xcode 界面中使用标识符“play”来使用来自 ios 的播放。我们越来越近了,因为我可以用你的方法改变背景图像,但是当我做同样的事情但改变图片时,为什么它不能以同样的方式工作?有没有办法直接更新图片? 我刚刚检查了标识符的变化,但结果相同。创建:[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemPause 目标:自我动作:@selector(pushPlay:)];在我的代码设置 self.play = pauseIco 中的播放也一样,但它什么也不做。 我终于成功地通过仅放置我自己的图像来使其工作,因此不使用标识符,但如果您知道使用标识符的方法,我将不胜感激。非常感谢。 @CladClad 我更新了我的答案,以展示我是如何使用系统按钮做到的。 最后我使用了 2 张图片,暂时没有标识符,但感谢您的帮助 :)【参考方案3】:

创建一个自定义按钮。更改按钮的大小以匹配图像。设置按钮的图像。将按钮视图添加到 UIBarButton 播放。

.h

IBOutlet UIBarButtonItem *play;

@property(nonatomic, retain) IBOutlet UIBarButtonItem *play;

.m

UIImage *image = [UIImage imageNamed:@"image.png"];
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom];
button1.bounds = CGRectMake( 0, 0, image.size.width, image.size.height );
[button1 setImage:image forState:UIControlStateNormal];
play = [[UIBarButtonItem alloc] initWithCustomView:button1];

确保在 Interface Builder 中为 UIBarButtonItem 连接插座。

祝你好运!

【讨论】:

【参考方案4】:

rdelmar 的回答很棒。我想添加一个增强功能,以避免按钮闪烁,因为删除和添加按钮。

-(void)pauseClick:(UIBarButtonItem *)sender 
    UIBarButtonItem *play = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPlay target:self action:@selector(playClick:)];
    NSMutableArray *tbItems = [self.toolBar.items mutableCopy];
    self.playPauseButton = play;
    //instead of remove and add the new button, use the replaceObjectAtIndex method.
    [tbItems replaceObjectAtIndex:2 withObject:play];
    self.toolBar.items = tbItems;

【讨论】:

【参考方案5】:

您可以为您的自定义按钮尝试这样的操作,作为 UIBarButtonItem 之一。

 - (void)viewDidLoad
 
   // add our custom image button as the nav bar's custom right view
   UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithImage:[UIImage    imageNamed:@"email.png"]
                                style:UIBarButtonItemStyleBordered target:self  action:@selector(action:)];
   self.navigationItem.rightBarButtonItem = addButton;
   [addButton release];
 

- (IBAction)action:(id)sender

    // the custom icon button was clicked, handle it here
    // change image here


【讨论】:

我不能使用这个,因为我的项目不在导航栏中,而是在屏幕中间的工具栏中。

以上是关于将 UiBarButtonItem 上的 UIImage 从标识符更新为图像的主要内容,如果未能解决你的问题,请参考以下文章

自定义 sg 控件和栏上的 UIButton 或 UIBarButtonItem 的背景

UIToolBar 上的 UIBarbuttonItem 的动作没有被调用

设备上的导航 UIBarButtonItem 外观不同

UIBarButtonItem 上的 ios-fontawesome

按下时以编程方式移除 UIBarButtonItem 上的灯光?

如何在导航栏上的 UIBarButtonItem 内偏移 UIButton 图像?