2

我有一个 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 不应该从动画中调用,我立即在那里设置新框架......

4

1 回答 1

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

有了这个,它应该在没有任何动画的情况下发生。希望这有效:)

于 2012-04-19T17:11:41.203 回答