我有一个 UIScrollView 的子类,它应该在顶部/底部淡出。(从 opaque 到 clearColor,就像 Notes.app 在 DetailView 底部所做的那样。)
所以我添加了一个 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;
但是当我滚动时,遮罩会随着内容滚动,而不是粘在屏幕位置上以很好地淡出内容。
我通过在滚动视图 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;
}
但是现在当我滚动时,面具的移动有点延迟。看起来面具的框架设置了延迟并设置了动画。
蒙版的滚动和移动都很流畅,所以我认为这不是硬件太慢的问题。
但怎么可能呢?layoutSubviews 不应该从动画中调用,我立即在那里设置新框架......