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 的限制?

4

1 回答 1

17

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

}
于 2013-07-11T12:27:35.883 回答