我有一个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/

10-13 06:07