使用UIGradientLayer作为layer.mask淡出滚动视图的底部/顶部 - >掩模的重新定位落后

Thy*_*raz 2 iphone objective-c ios

我有一个UIScrollView的子类,应该在顶部/底部淡出.(从opaque到clearColor,就像DetailView底部的Notes.app一样.)

所以我添加了一个UIGradientLayer作为scrollview.layer.mask,它似乎工作正常,直到我第一次滚动:

    CAGradientLayer *mask = [CAGradientLayer layer];
    mask.locations = [NSArray arrayWithObjects:
                      [NSNumber numberWithFloat:0.0],
                      [NSNumber numberWithFloat:0.1],
                      [NSNumber numberWithFloat:0.9],
                      [NSNumber numberWithFloat:1.0],
                      nil];

    mask.colors = [NSArray arrayWithObjects:
                   (__bridge id)[UIColor clearColor].CGColor,
                   (__bridge id)[UIColor whiteColor].CGColor,
                   (__bridge id)[UIColor whiteColor].CGColor,
                   (__bridge id)[UIColor clearColor].CGColor,
                   nil];

    mask.frame = self.scrollview.bounds;
    // vertical direction
    mask.startPoint = CGPointMake(0, 0); 
    mask.endPoint = CGPointMake(0, 1);

    self.scrollview.layer.mask = mask;
Run Code Online (Sandbox Code Playgroud)

但是当我滚动时,屏幕会滚动内容而不是粘在屏幕位置上,以便很好地淡出内容.

我通过在scrollviews layoutSubviews中重新定位掩码来解决这个问题:

-(void)layoutSubviews {
    [super layoutSubviews];

    CGRect layerMaskFrame = self.layer.mask.frame;
    layerMaskFrame.origin = [self convertPoint:self.bounds.origin toView:self];

    self.layer.mask.frame = layerMaskFrame;
}
Run Code Online (Sandbox Code Playgroud)

但是当我滚动时,现在面具的移动有点延迟了.看起来掩码的帧设置有延迟和动画.

两者,面具的滚动和移动都是平滑的,所以我不认为这是一个太慢的硬件问题.

但那怎么可能呢?不应该从动画中调用layoutSubviews,我立即在那里设置新框架......

小智 6

参考这篇文章http://cocoawithlove.com/2009/08/adding-shadow-effects-to-uitableview.html你必须像这样围绕你的框架更改:

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];

// Set the frame

[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)

有了它,它应该没有任何动画.希望这工作:)