自定义 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

如何调整自定义 UIButton 的图像大小?

UIButton自定义按钮不会在选择时更改字体颜色

自定义 UIButton 背景图像在点击之前不会出现

无法更改 UITableViewCell 内的 UIButton 图像

使用普通/高亮图像创建自定义 UIButton