【问题标题】:CAGradientLayer in UITableViewCellUITableViewCell 中的 CAGradientLayer
【发布时间】:2014-12-03 14:18:08
【问题描述】:

我有一个UITableViewCell,它有一个UIView (gradientView),我想在其中应用渐变。这个单元格有自动布局,所以我想在gradientView 框架发生变化时更新渐变框架。

我尝试了以下方法,但都没有奏效:

-(void)layoutSubviews{
    [super layoutSubviews];
     self.gradient.frame = self.gradientView.bounds;
}

-(void)updateConstraints{
    [super updateConstraints];
    self.gradient.frame = self.gradientView.bounds;
}

-(void)updateConstraintsIfNeeded{
    [super updateConstraintsIfNeeded];
    self.gradient.frame = self.gradientView.bounds;
}

我也不能在单元格内使用它:

- (void)viewDidLayoutSubviews{}

【问题讨论】:

    标签: ios objective-c uitableview cagradientlayer


    【解决方案1】:

    就我个人而言,我总是使用 KVO 来更改图层框架。在加载单元子视图后放置这一行(-(void)awakeFromNib,如果您使用的是 IB/storyboards)。重要的是,这条线在单元格的生命周期中只会被调用一次!

    [self.gradientView.layer addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew context:nil];
    

    那么就实现这个方法:

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
        if(object==self.gradientView.layer && self.gradient.superlayer!=nil){
            CGRect newFrame = [change[NSKeyValueChangeNewKey] CGRectValue];
            dispatch_async(dispatch_get_main_queue(), ^{
                self.gradient.frame = newFrame;
            });
        }
    }
    

    我将帧更新放在 dispatch_async 块中,因为没有它,层不会更新。

    并且不要忘记删除观察者,例如。在dealloc中:

    -(void)dealloc{
        [self.gradientView.layer removeObserver:self forKeyPath:@"bounds"];
    }
    

    【讨论】:

    • 那行得通,我只有一个问题。当我第一次设计表格视图时,渐变适合动画。知道为什么吗?
    • @rob180 不,可能是gradienViewgradient 帧在开始时是CGRectZero,所以iOS 决定为这个大小的大变化制作动画?
    • 它们不是零,我必须想办法禁用这个动画
    【解决方案2】:

    我建议创建一个新的 UIView 子类,其支持层 (layerClass) 是 CAGradientLayer。根据需要应用颜色。每当视图的bounds 更改时,iOS 也会在内部调整layer 的大小。

    如果您想让它更简单,只需从此处获取 OBGradientView 并在您的项目中使用它。 https://github.com/ole/OBGradientView

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多