在ScrollView中滚动CALayer的蒙版

11

我正在尝试使用iOS SDK,有如下的UIView结构:

  • UIView
    • UIImageView - 只有一个背景图像
    • UIImageView(带有CALayer遮罩层)
    • UIScrollView
      • Label

非常简单的结构,UIScrollView是透明层,第二个UIImageView上有一个遮罩层。我想做的是,CALayer遮罩层的位置会根据滚动视图中内容的位置而移动。如果用户滚动,就应该更新遮罩层的位置。我已经通过使用UIScrollView的委托解决了这个问题:

- (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 的极限?

2个回答

17

CALayer的某些属性如position会有隐式动画效果,尝试禁用它们:

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

}

1
太棒了,问题已经解决。非常感谢你。遮罩位置的变化现在更加流畅了。 - Legoless

0

对我来说,解决方案如下:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        CATransaction.begin()
        CATransaction.setDisableActions(true)
        layerGradient?.frame = scrollView.safeAreaLayoutGuide.layoutFrame
        CATransaction.commit()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接