Я хочу создать 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];
}
}
Вы можете попробовать использовать метод setContentOffset: animated: YES'. – danypata
Я пробовал (вы можете увидеть его в комментариях), но он работает еще хуже –
Вы всегда можете самостоятельно оформить свойство 'contentOffset' и использовать опцию' UIViewAnimationOptionBeginFromCurrentState'. – Mar0ux