我有一个UITableViewCell,它有一个UIView (gradientView),在这里我想应用梯度。这个单元格有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{}发布于 2014-12-03 14:49:57
我建议创建一个新的UIView子类,其支持层(layerClass)是一个CAGradientLayer。根据需要应用颜色。每当视图的bounds更改时,iOS也会在内部调整layer的大小。
如果您想使它更简单,只需从这里抓取OBGradientView并在您的项目中使用它。https://github.com/ole/OBGradientView
发布于 2014-12-03 14:35:03
就我个人而言,我总是使用KVO来改变图层帧。在加载了单元格子视图之后(如果使用IB/情节提要,则使用-(void)awakeFromNib)。重要的是,这一行将只在单元格生命周期中被调用一次!
[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"];
}https://stackoverflow.com/questions/27273992
复制相似问题