【问题标题】:Custom UIButton does not change its image自定义 UIButton 不会更改其图像
【发布时间】: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; } @结尾

我的问题是为什么我的自定义按钮不改变它的形象???谢谢。

【问题讨论】:

    标签: ios objective-c uibutton


    【解决方案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 中,有很多这样的自定义按钮。这就是为什么我必须编写我的通用自定义按钮。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      相关资源
      最近更新 更多