UITableViewCell中的CAGradientLayer

时间:2014-12-03 14:18:08

标签: ios objective-c uitableview cagradientlayer

我的UITableViewCell有一个UIViewgradientView),我想要应用渐变。此单元格具有AutoLayout,因此我想在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{}

2 个答案:

答案 0 :(得分:1)

我个人总是使用KVO来改变图层框架。加载单元格子视图后放置此行(-(void)awakeFromNib如果您正在使用IB /故事板)。重要的是这条线在电池寿命中只被调用一次!

[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"];
}

答案 1 :(得分:1)

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

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