在事件上更改UIButton背景图像

时间:2013-02-24 12:00:34

标签: ios objective-c uibutton uiswitch

UISwitch从“关闭”更改为“开启”时,我希望更改UIButton的背景图片。我有以下代码:

- (IBAction)switchValueChanged {
    if (Hard1ON.on) {
        UIImage *buttonImage = [UIImage imageNamed:@"red.jpg"];
        [Hard1 setImage:buttonImage forState:UIControlStateNormal];
        [self.view addSubview:Hard1];
        NSLog(@"Change");
    }
    else {
        UIImage *buttonImage = [UIImage imageNamed:@"white.jpg"];
        [Hard1 setImage:buttonImage forState:UIControlStateNormal];
        [self.view addSubview:Hard1];
    }
}

当我按下开关时,控制台正确记录,所以我知道它正在工作,但按钮的背景不会改变。

作为参考,Hard1ON是我的UISwitchHard1是我的UIButton

3 个答案:

答案 0 :(得分:4)

添加按钮一次,最常见的方法是在viewDidLoad中添加按钮,然后在执行切换时更改其图像。

所以,在viewDidLoad方法

// create the button
[self.view addSubview:Hard1];

然后,在你的值改变方法

if (Hard1ON.on) {
    UIImage *buttonImage = [UIImage imageNamed:@"red.jpg"];
    [Hard1 setImage:buttonImage forState:UIControlStateNormal];
    NSLog(@"Change");
} else {
    UIImage *buttonImage = [UIImage imageNamed:@"white.jpg"];
    [Hard1 setImage:buttonImage forState:UIControlStateNormal];
}

注意 使用camelCase表示法命名变量

例如,Hard1应该看起来像hard1。将其命名为hard1Button或类似名称会更好。这同样适用于开关元件。例如,hard1OnSwicth

修改

我会尝试在viewDidLoad方法中以编程方式创建按钮。

- (void)viewDidLoad
{ 
    [super viewDidLoad];

    self.hardButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [self.hardButton setFrame:CGRectMake(0, 0, 200, 50)]; // set the x,y,width and height based on your specs
    UIImage *buttonImage = [UIImage imageNamed:@"white.jpg"];
    [self.hardButton setImage:buttonImage forState:UIControlStateNormal];
    [self.view addSubview:self.hardButton];
}

其中hardButton是对.h(例如)

中声明的按钮的引用
@property (nonatomic, assign) UIButton* hardButton;

合成它(如果你愿意,如果不是Xcode会照顾你),就像这样

@synthesize hardButton = _hardButton;

如果您使用保留而不是分配,并且您不在dealloc中使用ARC版本

- (void)dealloc
{ 
   [_hardButton release];
   [super dealloc];
}

现在,您的开关值已更改。

- (IBAction)switchValueChanged
{
    UIImage* buttonImage = nil;
    if (Hard1ON.on) {
        buttonImage = [UIImage imageNamed:@"red.jpg"];
    } else {
        buttonImage = [UIImage imageNamed:@"white.jpg"];
    }

    [self.hardButton setImage:buttonImage forState:UIControlStateNormal];
}

答案 1 :(得分:0)

我认为您要使用-setBackgroundImage:forState:代替-setImage:forState:

而且,正如@flexaddicted所说,你只想添加一次按钮。

答案 2 :(得分:0)

如果您使用按钮作为开关,您可以这样。

  _btnMale = [UIButton buttonWithType:UIButtonTypeCustom];
   [_btnMale setBackgroundImage:[ UIImage imageNamed:@"checkBox.png"] forState:UIControlStateNormal];
   [_btnMale setBackgroundImage:[ UIImage imageNamed:@"checkMark.png"] forState:UIControlStateSelected];
   _btnMale.tag = 1;
   _btnMale.frame = CGRectMake(150 , 9, 25, 25);
   [_btnMale addTarget:self action:@selector(selectGender:) forControlEvents:UIControlEventTouchUpInside];
   [self addSubview:_btnMale];

根据需要在viewDidLoad / viewDidAppear方法中设置所选和正常状态的按钮图像。声明后,在目标方法中添加此代码。

-(void)selectGender:(UIButton*)sender{

  sender.selected = ! sender.selected;

}

然后将其他按钮设置为选中NO。然后按钮就像开关一样工作。

希望这会对你有所帮助。