Перемещение маски CALayer на прокрутку в Scrollview

Я экспериментирую с iOS SDK, и у меня есть следующая структура UIView:

  • UIView
    • UIImageView - только фоновое изображение
    • UIImageView (с маской CALayer)
    • UIScrollView
      • Label

Очень простая структура, UIScrollView - прозрачный слой, а второй UIImageView имеет на нем маску. То, что я пытаюсь сделать, это то, что маска CALayer переместила бы ее положение в соответствии с положением содержимого в прокрутке. Если пользователь прокручивает, положение маски должно быть обновлено. Я уже решил эту проблему, используя UIScrollView delegate:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGPoint contentOffset = scrollView.contentOffset;
    contentOffset.y = -contentOffset.y;

    self.overlayImageView.viewlayer.mask.position = contentOffset;
}

Маска создается в viewDidLoad и не изменяется во время жизненного цикла контроллера.

Проблема заключается в том, что обновление положения маски слишком медленное. Таким образом, он выглядит, что маска следит за просмотром содержимого прокрутки, а не прокручивается с ней. Метод делегата scrollViewDidScroll вызывается правильно.

Чтобы лучше понять проблему, я прикрепляю видео, которое я сделал в iOS-симуляторе. http://www.youtube.com/watch?v=w3xRl3LTngY

Итак, вопрос:

Есть ли способ сделать обновление маски быстрее или это предел iOS?

Ответ 1

CALayer неявные анимированные для некоторых свойств, таких как позиция, пытаются их отключить:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{

[CATransaction begin];
    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
CGPoint contentOffset = scrollView.contentOffset;
contentOffset.y = -contentOffset.y;

self.overlayImageView.viewlayer.mask.position = contentOffset;
[CATransaction commit];

}