2013-05-30 99 views
1

我想用滾動按鈕創建UIScrollView.So當用戶按下左箭頭按鈕時,滾動必須正確滾動。帶滾動按鈕的UIScrollView問題

問題是:當我點擊按鈕3次快速滾動不能正確滾動(因爲scrollRectToVisible許多調用)。可能我可以在下一個動畫之前停止當前的動畫嗎?

P.S.如果我設置[self scrollScrollViewToIndex:index animated:NO]一切工作正常,但我需要動畫

這裏是我的代碼:

- (void)scrollScrollViewToIndex:(int)index animated:(BOOL)animated 
{ 
    NSLog(@"scrolled to index: %d", index); 
    CGFloat offsetX = CGRectGetWidth(_scrollMain.frame) * index; 
    CGRect scrollRect = CGRectMake(offsetX, 0, CGRectGetWidth(_scrollMain.frame), CGRectGetHeight(_scrollMain.frame));  
    [_scrollMain scrollRectToVisible:scrollRect animated:animated]; 
// [self.scrollMain setContentOffset:CGPointMake(offsetX, 0) animated:animated]; 
} 

- (IBAction)leftArrowPressed:(id)sender 
{ 
    int indexOfVoucher = [_arrayVouchers indexOfObject:_voucher]; 
    indexOfVoucher--; 
    self.voucher = [_arrayVouchers objectAtIndex:indexOfVoucher]; 
    [self updateViewWithVoucherWithScrolling:YES]; 
} 

- (IBAction)rightArrowPressed:(id)sender 
{ 
    int indexOfVoucher = [_arrayVouchers indexOfObject:_voucher]; 
    indexOfVoucher++; 
    self.voucher = [_arrayVouchers objectAtIndex:indexOfVoucher]; 
    [self updateViewWithVoucherWithScrolling:YES]; 
} 

- (void)updateViewWithVoucherWithScrolling:(BOOL)withScrolling 
{ 
    int indexOfVoucher = [_arrayVouchers indexOfObject:_voucher]; 
    _leftArrowButton.hidden = _rightArrowButton.hidden = NO; 
    if (indexOfVoucher == 0) 
    { 
     _leftArrowButton.hidden = YES; 
    } 
    else if (indexOfVoucher == [_arrayVouchers count] - 1) 
    { 
     self.rightArrowButton.hidden = YES; 
    } 
    if (withScrolling) 
    { 
     [self scrollScrollViewToIndex:indexOfVoucher animated:YES]; 
    } 
} 

更新:根據Mar0ux的建議 工作代碼

- (void)scrollScrollViewToIndex:(int)index animated:(BOOL)animated 
{ 
    NSLog(@"scrolled to index: %d", index); 
    CGFloat offsetX = CGRectGetWidth(_scrollMain.frame) * index; 

    if (animated) 
    { 
     [UIView animateWithDuration:0.5 
           delay:0.0 
          options:UIViewAnimationCurveEaseInOut | UIViewAnimationOptionBeginFromCurrentState //Multiple options 
         animations:^ { 
          //       [self.scrollMain setContentOffset:CGPointMake(offsetX, 0) animated:NO]; 
          CGRect scrollRect = CGRectMake(offsetX, 0, CGRectGetWidth(_scrollMain.frame), CGRectGetHeight(_scrollMain.frame)); 
          [_scrollMain scrollRectToVisible:scrollRect animated:NO]; 
         } 
         completion:^ (BOOL finished) { 

         }]; 
    } 
    else 
    { 
     CGRect scrollRect = CGRectMake(offsetX, 0, CGRectGetWidth(_scrollMain.frame), CGRectGetHeight(_scrollMain.frame)); 
     [_scrollMain scrollRectToVisible:scrollRect animated:NO]; 
    } 
} 
+0

你可以嘗試使用'setContentOffset:animated:YES'方法。 – danypata

+0

我試過了(你可以在評論代碼中看到它),但它的效果更差 –

+0

你可以自己動畫'contentOffset'屬性並使用'UIViewAnimationOptionBeginFromCurrentState'選項。 – Mar0ux

回答

1

你可以總是自己動畫contentOffset屬性並使用UIViewAnimationOptionBeginFromCurrentState選項。一旦第二個動畫開始,第一個動畫將結束,並且通過使用當前狀態選項,第二個動畫將從第一個動畫開始停止。

0

幾點建議:

1)你真的想上,而它的滾動的按鈕,用戶敲擊?如果是這樣,那麼我建議你的UI設計可能需要重新設計。

2)當您在動作方法中擾亂用戶界面時,最好通過將代碼分派給主隊列來發布其他用戶界面操作 - 按鈕hiliting看起來會更好。

3)在您的具體情況下,您可以在操作方法中禁用按鈕,然後在滾動停止時重新啓用它。