在Scrollview中滚动CALayer的蒙版

Leg*_*ess 10 core-animation core-graphics uiview uiimage ios

我正在尝试iOS SDK,我有以下UIView结构:

  • UIView
    • UIImageView - 只有背景图片
    • UIImageView(带CALayer面具)
    • UIScrollView
      • Label

结构非常简单,UIScrollView是透明层,第二层UIImageView有遮罩.我想要做的是CALayer掩码会根据滚动视图中内容的位置移动它的位置.如果用户滚动,则应更新蒙版的位置.我已经通过使用UIScrollView's委托解决了这个问题:

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

    self.overlayImageView.viewlayer.mask.position = contentOffset;
}
Run Code Online (Sandbox Code Playgroud)

掩码viewDidLoad在视图控制器的生命周期中创建并且不会更改.

问题是掩模位置更新太慢.这样看起来掩码跟随滚动视图的内容,而不是滚动它.该scrollViewDidScroll委托方法正确调用.

为了更好地理解这个问题,我附上了我在iOS模拟器中制作的视频. http://www.youtube.com/watch?v=w3xRl3LTngY

所以问题是:

有没有办法让面具更新更快,或者这是iOS的限制?

And*_*rea 16

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];

}
Run Code Online (Sandbox Code Playgroud)