在调用setImage:之后,UIButton不会更新它的图像

时间:2012-07-24 21:26:11

标签: ios uiview uibutton

这是问题 - 我有一个类,它是UIView(卡片)的子类。它在自身上创建一个按钮,它调用changeStateIndicator:当用户触摸它时。

然后按下按钮后卡片必须翻转,按钮应该改变它的颜色(实际上是图像)。但它根本没有发生,所以在按钮改变之前翻转开始。这是我的代码:

//Adding a button to my view
UIButton *changeStateButton = [UIButton buttonWithType:UIButtonTypeCustom];
[changeStateButton setImage:[UIImage imageNamed:imageToInitWith] forState:UIControlStateNormal];
[changeStateButton setImage:[UIImage imageNamed:imageToInitWith] forState:UIControlStateHighlighted];
changeStateButton.frame = CGRectMake(0, 0, 30, 30);
changeStateButton.center = CGPointMake(self.bounds.size.width/2+([myWord length]*8)+17, 35);
changeStateButton.tag = 77;
[changeStateButton addTarget:self action:@selector(changeStateIndicator:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:changeStateButton];

//Method which is called when the button is touched
- (void)changeStateIndicator:(UIButton *)sender
{
    [sender setImage:[UIImage imageNamed:@"StateYellow"] forState:UIControlStateNormal];
    [sender setImage:[UIImage imageNamed:@"StateYellow"] forState:UIControlStateHighlighted];
    currentWord.done = [NSNumber numberWithInt:currentWord.done.intValue-10];
    [self prepareForTest];
}

//Method which flips the card
- (void)prepareForTest
{
    testSide = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"cal_small3"]];
    [UIView transitionFromView:self toView:testSide duration:0.5 options:UIViewAnimationOptionTransitionFlipFromRight completion:nil];
}

我的猜测是发送方不会改变它的图像,直到方法-changeStateIndicator结束它,但我不确定这是否是实际问题。请帮帮我。

2 个答案:

答案 0 :(得分:3)

尝试推迟此调用:

dispatch_async(dispatch_get_main_queue(), ^{ [self prepareForTest]; });

如果那种方法有效但仍然不是你想要的,那么使用dispatch_after()或

[self performSelector:@selector(prepareForTest) withObject:nil afterDelay:0.25f];

(如果你愿意的话,可以使用时间为“0”的第二次调用而不是发送 - 同样的事情。)

答案 1 :(得分:0)

当调用drawRect:方法时,您需要再次通过运行循环使按钮重绘自身。 setImage:方法只设置它将使用的图像。相反,你会在这种情况发生前开始动画。这就是为什么一个非常短暂的延迟解决了这个问题。

修复此问题的另一种方法,即使在美学上更具吸引力,是为按钮图像更改设置动画。当该动画完成后,启动另一个动画。