将 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 上的 ios-fontawesome