Анимированная прокрутка UIScrollView с CoreAnimation - PullRequest
16 голосов
/ 23 февраля 2012

Извините за большой вопрос, реальный вопрос жирный внизу, теперь некоторые объяснения.

Я использую CoreAnimation в своем проекте для анимации некоторых объектов, движущихся следующим образом.

CABasicAnimation *moveAnimation;        
moveAnimation=[CABasicAnimation animationWithKeyPath:@"position"];      
moveAnimation.duration = 2.0;       
moveAnimation.repeatCount=1;        
moveAnimation.autoreverses=NO;  
moveAnimation.delegate = self;
moveAnimation.fromValue = [NSValue valueWithCGPoint:[crawler.layer position]];
moveAnimation.fillMode = kCAFillModeForwards;
moveAnimation.removedOnCompletion = NO;
CGPoint p;
moveAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
[crawler.layer addAnimation:moveAnimation forKey:@"moveAnimation"];

А теперь мне нужно анимировать прокрутку некоторого UIScrollView. Я не могу использовать setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated метод, потому что он не может настроить продолжительность анимации.

Я могу сделать это так

CGContextRef context = UIGraphicsGetCurrentContext();
[UIView beginAnimations:nil context:context];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration:2];
[UIView setAnimationDelegate:self];
scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x + 200, scrollView.contentOffset.y);
[UIView commitAnimations];

но это не CoreAnimation, и я думаю, использование двух разных видов анимации в одном приложении не очень хорошая практика.

Есть ли способ использовать CoreAnimation для анимации прокрутки содержимого UIScrollView в пользовательскую точку с настраиваемой продолжительностью анимации? Постскриптум Извините за плохой английский.

Ответы [ 4 ]

26 голосов
/ 27 февраля 2012

Вы можете использовать:

[UIView animateWithDuration:duration animations:^ {
    [scrollView setContentOffset:destination animated:NO];
}];

Вы можете установить продолжительность анимации таким образом.

7 голосов
/ 28 февраля 2012
[UIScrollViewNameHere setContentOffset:CGPointMake(x value of where you want to move to, y value of where you want to move to) animated:YES];

например:

UIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(4, 2, 2341, 412)];
[scroll setContentOffset:CGPointMake(320, 0) animated:YES];
5 голосов
/ 04 марта 2012

Вы должны прочитать об анимируемых свойствах, Программирование iOS 5

Действительно, когда вы пытаетесь анимировать слои, Apple предоставляет набор анимируемых свойств, но вы не ограничены этимзадавать.Вы можете анимировать все, что захотите.

Во всех случаях не следует использовать kCAFillModeForwards, поскольку оно будет просить устройство навсегда перерисовать последний слой представления, который использовался для анимации, вместо использования кэшированногопредставление слоя.

Таким образом, вы могли бы достичь такой цели, определив свой конкретный слой, где свойство contentOffset определено как анимируемое.И для того, чтобы работать, вы должны начать с проверки того, какой класс верхнего слоя используется в scrollview, чтобы, путем создания его подкласса и установки свойствализуемого свойства (contentOffset), и создания подкласса вашего scrollview, установив этот слой какверхний слой прокрутки, вы можете достичь того, что вы пытаетесь сделать.

Это теория!

Но это то, что я бы попробовал.Ищите этот метод, его поведение и намерения

+ (BOOL)needsDisplayForKey:(NSString *)key

Другая вещь, которую вы можете прочитать, это Начальный пример .Но это также означает, что вы должны самостоятельно перерисовать свой uiscrollview!

4 голосов
/ 23 февраля 2012

Не думаю, что вы можете оживить точку с помощью CoreAnimation.

Но вы можете попробовать setContentOffset:animated: это метод, который вы ищете?

Вы можете преобразовать только следующие свойства UIView

  • рама * * 1 010
  • 1012 * оценка *
  • центр
  • преобразование
  • альфа
  • BackgroundColor
  • contentStretch

больше информации CoreAnimation об оформлении заказа на анимацию Документация Apple

...