我有一个UIScrollView的子类,应该在顶部/底部淡出。
(从不透明到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;
但是,当我滚动时,遮罩会与内容一起滚动,而不是停留在屏幕位置上以使内容很好地淡出。
我通过在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;
}
但是现在,当我滚动时,遮罩的移动有点延迟了。
看起来蒙版的帧设置了延迟并具有动画效果。
蒙版的滚动和移动都可以流畅进行,因此我认为硬件速度太慢不是问题。
但是那怎么可能呢?不应从动画中调用layoutSubviews,而是在此处立即设置新框架...
最佳答案
参考本文http://cocoawithlove.com/2009/08/adding-shadow-effects-to-uitableview.html,您必须像这样围绕框架更改:
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
// Set the frame
[CATransaction commit];
有了它,它应该没有任何动画。希望这有效:)
关于iphone - 使用UIGradientLayer作为layer.mask淡出 ScrollView 的底部/顶部-> mask 的重新放置滞后,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10232135/