自定义 UIButton 不会更改其图像
Posted
技术标签:
【中文标题】自定义 UIButton 不会更改其图像【英文标题】:Custom UIButton does not change its image 【发布时间】:2014-06-15 16:21:11 【问题描述】:我创建了一个自定义 UIButton,它有一个“已选择”字段来标识该按钮是否被选中。默认情况下:它将其图像设置为 image1。当它被选中时,它会变为 image2。
@interface MyButton: UIButton @property (getter=isSelected, setter=setSelected:) BOOL 选择; @结尾 @implementation 我的按钮 @synthesize selected = _selected; - (id)initWithFrame:(CGRect)frame self = [super initWithFrame:frame]; 如果(自我) 自我选择=否; 回归自我; -(void) setSelected:(BOOL) 选中 如果(选择) [self setImage:[UIImage imageNamed:@"image1"] forState:UIControlStateNormal]; 别的 [self setImage:[UIImage imageNamed:@"image2"] forState:UIControlStateNormal]; _selected = 选中; -(BOOL) 被选中 返回 _selected;现在,我从 UIViewController 将这个自定义按钮添加到它的视图中。当用户单击另一个按钮时,我希望我的自定义按钮应该更改其图像(从 image1 -> image2 反之亦然)。
@interface 会话视图控制器 () 我的按钮* btn; @结尾 @implementation 视图控制器 -(无效)viewDidLoad [超级视图DidLoad]; btn = [[MyButton alloc] initWithFrame: CGRectMake(0,0,100,100)]; - (IBAction) touchChangeStateButton 布尔 b = btn.isSelected; btn.selected = !b; @结尾我的问题是为什么我的自定义按钮不改变它的形象???谢谢。
【问题讨论】:
【参考方案1】:我认为问题在于 UIButton 的内置 selected 属性干扰了您的自定义属性。我尝试将名称更改为“选择”(只是为了使其与众不同)并更改所有相应的代码,如下所示,它似乎可以按您的预期工作。
@interface MyButton : UIButton
@property (getter=isSelacted, setter=setSelacted:) BOOL selacted;
@end
@implementation MyButton
@synthesize selacted = _selacted;
- (id)initWithFrame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
self.selacted = NO;
return self;
-(void) setSelacted:(BOOL)selacted
if (selacted)
[self setImage:[UIImage imageNamed:@"image1"] forState:UIControlStateNormal];
else
[self setImage:[UIImage imageNamed:@"image2"] forState:UIControlStateNormal];
_selacted = selacted;
-(BOOL) isSelacted
return _selacted;
然后在你的 viewController 中:
- (IBAction) touchChangeStateButton
BOOL b = btn.isSelacted;
btn.selacted = !b;
【讨论】:
【参考方案2】:改变这个:
if (selected)
[self setImage:[UIImage imageNamed:@"image1"] forState:UIControlStateNormal];
else
[self setImage:[UIImage imageNamed:@"image2"] forState:UIControlStateNormal];
有了这个:
if (selected)
// set image for selected state
[self setBackgroundImage:[UIImage imageNamed:@"image1"] forState:UIControlStateSelected];
else
// set image for normal state
[self setBackgroundImage:[UIImage imageNamed:@"image2"] forState:UIControlStateNormal];
或者您可以从您的 init 方法中简单地一次性定义两个图像
[self setBackgroundImage:[UIImage imageNamed:@"image2"] forState:UIControlStateSelected];
[self setBackgroundImage:[UIImage imageNamed:@"image1"] forState:UIControlStateNormal];
【讨论】:
我的目的是改变它的图像,而不是改变它的状态(例如,UIControlStateSelected、UIControlStateNormal)。你的方法行不通。 你没有改变它的状态,只是每个状态的背景图像。在正常状态下更改图像不会影响处于选中状态的按钮。然后,您需要在 init 方法中定义所有图像以与此按钮一起使用。如果这是您唯一需要的,您甚至不需要创建 MyButton 类,只需在以编程方式初始化按钮时设置图像 不,实际上我的情况更复杂。我不想在这里写所有代码。我的自定义按钮包含其他子视图,如 2 个 UILabel、2 个 UIImageViews 等……而在 UIViewController 中,有很多这样的自定义按钮。这就是为什么我必须编写我的通用自定义按钮。以上是关于自定义 UIButton 不会更改其图像的主要内容,如果未能解决你的问题,请参考以下文章
使用 UIButton 自定义 UITableViewCell:无法更改 UIImage