iphone - 使用 UIGradientLayer 作为 layer.mask 淡出 ScrollView 的底部/顶部 --> 掩码的重新定位滞后

标签 iphone objective-c ios

我有一个 UIScrollView 的子类,它应该在顶部/底部淡出。 (从不透明到透明颜色,就像 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;

但是当我滚动时, mask 会随着内容一起滚动,而不是停留在屏幕位置以很好地淡出内容。

我通过在 ScrollView 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;
}

但现在当我滚动时, mask 的移动有点延迟。 看起来面具的框架设置了延迟和动画。

mask 的滚动和移动都很流畅,所以我认为这不是硬件太慢的问题。

但这怎么可能呢?不应从动画中调用 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 的底部/顶部 --> 掩码的重新定位滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10232135/

相关文章:

iphone - iOS 中的 3D 文字效果

iphone - 使用 MobileSubstrate 修改 iPhoneOS 上的所有 HTTP 请求?

ios - 在 XIB 之外设置 UITableViewCell 背景

ios - 哪个MagicalRecord保存方法

iphone - 使用 Google App 引擎创建用户控制的数据服务

iphone - 在 iOS 5 中编译时出现 SQlite 3 错误

iphone - 取消引用 NSCoder 的decodeBytesForKey 返回的指针时,iOS 设备崩溃

ios - 我已使用桥接 header 将 Objective-C 文件导入到 Swift 项目中,但出现错误 "Expected a type"

ios - ASIHTTPREQUEST 根据请求更改 View Controller 已完成

ios - 在该单元格中调整自定义 UITableViewCell 高度和 UITextView 的高度(存在其他 UI 元素)