2013-05-30 3 views
1

Я хочу создать UIScrollView с помощью кнопок прокрутки. Поэтому, когда пользователь нажимает кнопку со стрелкой влево, прокрутка должна прокручиваться должным образом.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) действительно ли вы хотите стук пользователя на кнопку во время его прокрутки? Если это так, я предлагаю, чтобы ваш дизайн пользовательского интерфейса мог нуждаться в редизайне.

2) когда вы нарушаете пользовательский интерфейс в методе действий, лучше разместить другие действия пользовательского интерфейса, отправив блок с кодом в основную очередь - кнопка hiliting будет выглядеть лучше.

3) в вашем конкретном случае вы можете в методе действий отключить кнопку, а затем снова включить ее, когда прокрутка остановлена.

Смежные вопросы