ios 在滚动视图中滚动时移动CALayer的遮罩

btxsgosb  于 2022-12-05  发布在  iOS
关注(0)|答案(2)|浏览(175)

我正在试用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的极限?

bakd9h0s

bakd9h0s1#

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

}
ppcbkaq5

ppcbkaq52#

我的解决方案如下:

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

相关问题