2010-06-03 99 views
7

所以我有一個按鈕和動畫的問題。基本上,我使用UIView動畫製作視圖的動畫,同時還試圖在視圖內按鈕上輕敲一下。該視圖與按鈕一樣大,視圖實際上是UIImageView的一個子類,在按鈕下面有一個圖像。該視圖是放置在Interface Builder中的容器視圖的子視圖,啓用了用戶交互並啓用了裁剪。所有動畫和按鈕處理都在此UIImageView子類中完成,而startFloating消息根據需要從單獨的類發送。iPhone UIView動畫禁用UIButton子視圖

如果我沒有動畫,buttonTapped:消息會被正確發送,但在動畫期間它不會被髮送。我也嘗試過實施touchesEnded方法,併發生相同的行爲。

的UIImageView子類的init(我已經用顏色填充,所以我可以看到幀按鈕被正確設置它一定):

- (id)initWithImage:(UIImage *)image { 
    self = [super initWithImage:image]; 
    if (self != nil) { 
     // ...stuffs 

     UIButton *tapBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
     tapBtn.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 
     [tapBtn addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside]; 
     tapBtn.backgroundColor = [UIColor cyanColor]; 
     [self addSubview:tapBtn]; 

     self.userInteractionEnabled = YES; 
    } 
    return self; 
} 
啓動動畫(如果我不

動畫方法所以

- (void)startFloating { 
    [UIView beginAnimations:@"floating" context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    [UIView setAnimationDuration:10.0f]; 
    self.frame = CGRectMake(self.frame.origin.x, -self.frame.size.height, self.frame.size.width, self.frame.size.height); 
    [UIView commitAnimations]; 
} 

,是明確的:把這個按鈕工作正常)

  • 使用的UIView動畫有效地禁用按鈕。
  • 禁用動畫會使按鈕生效。
  • 按鈕的大小和位置正確,並且正確地與視圖一起移動。

回答

7

動畫只是眼睛的糖果。動畫滯後於視圖的實際移動。當動畫開始時,該按鈕已經在目的地點。您只會看到正在移動的視圖/按鈕的電影。

如果您想要在動畫過程中點擊某個按鈕,您必須自己製作動畫。

+0

嗯。這看起來相當不錯,但與動畫的預期相反。當你說「自己製作動畫」時,你指的是NSTimer風格的動畫?另外我假設實施觸摸方法家族會表現出相同的行爲? – bensnider 2010-06-03 20:22:11

+0

所以是使用NSTimer動畫我能夠以這種方式使用按鈕。謝謝。 – bensnider 2010-06-04 14:03:21

+0

你也可以自己做觸摸追蹤,而不是依賴按鈕。它仍然需要一些手動動畫,但可能會爲您提供更好的交互效果。 – axiixc 2011-06-14 19:01:11

5

...遇到了同樣的問題,因爲我的代碼每塊做一個大動畫。我製作了一個基於NSTimer的解決方案,就像上面提到的解決方案一樣,它的工作原理...然而這個運動是生澀的(除非我在每個計時器事件觸發器中插入動畫)。

因此,由於無論如何都需要動畫,所以我找到了一個不需要定時器的解決方案。它動畫只有短距離,因此按鈕點擊仍然準確,只有一個小的錯誤,這是我的情況是非常不明顯的用戶界面,並可以減少取決於你的參數。

請注意,在任何給定時間的錯誤是< 15.0,根據您的動畫速度要求,可以降低誤差以獲得更高的精度。您還可以縮短更長時間的持續時間。

- (void)conveyComplete:(UIView*)v 
{ 
    [self convey:v delay:0]; 
} 

- (void)convey:(UIView*)v delay:(int)nDelay 
{ 
    [UIView animateWithDuration:.5 
          delay:nDelay 
         options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction) 
        animations:^
        { 
         CGRect rPos = v.frame; 
         rPos.origin.x -= 15.0; 
         v.frame = rPos; 
        } 
        completion: ^(BOOL finished) 
        { 
         [self conveyComplete:v]; 
        }]; 

} 
20

這解決了問題:做一些測試我相信你是正確的後

[UIView animateWithDuration:20 delay: 0.0 options: UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction 
    ... 
+1

'UIViewAnimationOptionAllowUserInteraction'是我所需要的。謝謝! – buildsucceeded 2012-01-29 14:07:00