Анимация прокрутки UIScrollView с CoreAnimation
Извините за большой вопрос, реальный вопрос жирный внизу, теперь некоторое объяснение.
Я использую 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 в пользовательскую точку с пользовательской продолжительностью анимации?
Постскриптум Извините за плохой английский.
Ответы
Ответ 1
Вы должны прочитать о анимационных свойствах, Программирование iOS 5
В самом деле, когда вы пытаетесь оживить слои, Apple дает набор анимационных свойств, но вы не ограничены этим набором. Вы можете анимировать все, что хотите.
Во всех случаях вы не должны использовать kCAFillModeForwards
, потому что он попросит устройство перерисовать навсегда последний слой презентации, который использовался для анимации, вместо использования кэшированного представления слоя.
Таким образом, вы могли бы достичь такого, чтобы определить определенный уровень, где свойство contentOffset
определяется как анимационное. И для того, чтобы работать, вы должны начать с проверки того, какой класс верхнего слоя используется scrollview, так что, подклассифицируя его и установив желаемое свойство (contentOffset
) animatable и подклассизируя ваш scrollview, установив этот слой как верхний слой scrollview, вы могли бы достичь того, что вы пытаетесь сделать.
Это теория!
Но это то, что я попробую.
Ищите этот метод, его поведение и намерения
+ (BOOL)needsDisplayForKey:(NSString *)key
Еще одна вещь, которую вы можете прочитать, - это Пример запуска. Но это также означает, что вы должны перерисовать свой uiscrollview самостоятельно!
Ответ 2
Вы можете использовать:
[UIView animateWithDuration:duration animations:^ {
[scrollView setContentOffset:destination animated:NO];
}];
Вы можете установить продолжительность анимации таким образом.
Ответ 3
[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];
Ответ 4
Я не думаю, что вы можете анимировать точку с помощью CoreAnimation.
Но вы можете попробовать setContentOffset:animated:
thiss метод, который вы ищете?
Вы можете преобразовать только следующие свойства UIView
- рамка
- Границы
- Центр
- преобразовать
- альфа
- BackgroundColor
- contentStretch
Дополнительная информация о CoreAnimation
об анимационной проверке Apple Documentation