UITableViewCell 中的 CAGradientLayer
Posted
技术标签:
【中文标题】UITableViewCell 中的 CAGradientLayer【英文标题】:CAGradientLayer in UITableViewCell 【发布时间】: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
【问题讨论】:
【参考方案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 不,可能是gradienView
或gradient
帧在开始时是CGRectZero
,所以ios 决定为这个大小的大变化制作动画?
它们不是零,我必须想办法禁用这个动画【参考方案2】:
我建议创建一个新的 UIView
子类,其支持层 (layerClass
) 是 CAGradientLayer
。根据需要应用颜色。每当视图的bounds
更改时,iOS 也会在内部调整layer
的大小。
如果您想让它更简单,只需从此处获取 OBGradientView
并在您的项目中使用它。 https://github.com/ole/OBGradientView
【讨论】:
你能举个例子吗? github.com/ole/OBGradientView 把它放到你的项目中,然后使用这个 UIView 子类。以上是关于UITableViewCell 中的 CAGradientLayer的主要内容,如果未能解决你的问题,请参考以下文章
确定 UITableViewCell 中的 UIButton
UITableViewCell 事件中的 UIButton 不起作用
UITableViewCell 中的 UICollectionView
UITableVIewCell 中的 UIScrollView 不会滚动