2012-07-24 89 views
4

這裏是問題 - 我有一個類,它是UIView(一張卡片)的子類。它自己創建一個按鈕,它調用changeStateIndicator:當用戶觸摸它時。UIButton在setImage之後不更新它的圖像:被調用

然後卡片必須在按下按鈕後翻動,按鈕應該改變它的顏色(實際上是圖像)。但它根本沒有發生,所以翻蓋在按鈕改變之前就開始了。這裏是我的代碼:

//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涉及到它的結束,但我不是很肯定這是實際的問題。請幫幫我。

+0

你是否嘗試不調用方法prepareForTest來檢查按鈕是否會像你期望的那樣改變它的顏色? – tiguero 2012-07-24 21:47:05

+0

也是如何延遲動畫 – tiguero 2012-07-24 21:59:34

+0

沒有prepareForTest它工作正常)我知道,因爲我們正在同一個項目) – 2012-07-24 22:02:59

回答

3

嘗試只推遲這一呼籲:

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

如果那樣的作品,但它仍然不是你想要的,然後使用dispatch_after()或

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

(你可以用第二如果你想要的話,請使用「0」的時間來代替調度 - 同樣的事情。)

+0

非常感謝。真。 – morgan1189 2012-07-24 22:36:46

+0

任何人都可以告訴mem爲什麼我們應該將這個ti移動到主線程?或者主要原因是讓它成爲異步? – 2012-07-25 05:53:00

+0

問題是這樣的:當這個動作消息被調用時,他的按鈕仍然是hilited,所以你可以延遲任何長時間運行的任務,直到發生事件,讓按鈕刷新。這個動作消息在主線程中出現,因爲那是UIKit的工作原理。現在,您可以將測試分派給任何線程IF和ONLY如果您知道可能訪問的任何IVAR或PROPERTY實際上是線程安全的(包括設置/清除和使用) - 在99%的時間內IT不是線程安全的。除非你有一個非常好的理由來解決這個問題。如果你需要建立它的工作原理。 – 2012-07-25 11:29:17

0

當調用方法drawRect:時,您需要再次運行循環才能重新繪製按鈕。 setImage:方法只是設置它在使用時使用的圖像。相反,你在這之前開始動畫。這就是爲什麼一個非常短的延遲解決了這個問題。

解決這個問題的另一種方法可能更美觀更具吸引力的方法是動畫化按鈕圖像更改。當動畫完成時,啓動另一個動畫。