首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CAGradientLayer in UITableViewCell

CAGradientLayer in UITableViewCell
EN

Stack Overflow用户
提问于 2014-12-03 14:18:08
回答 2查看 648关注 0票数 0

我有一个UITableViewCell,它有一个UIView (gradientView),在这里我想应用梯度。这个单元格有AutoLayout,所以当gradientView帧改变时,我想更新渐变帧。

我试过以下几种方法,但没有一种有效:

代码语言:javascript
复制
-(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;
}

我也不能在牢房里用这个:

代码语言:javascript
复制
- (void)viewDidLayoutSubviews{}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-03 14:49:57

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-12-03 14:35:03

就我个人而言,我总是使用KVO来改变图层帧。在加载了单元格子视图之后(如果使用IB/情节提要,则使用-(void)awakeFromNib)。重要的是,这一行将只在单元格生命周期中被调用一次!

代码语言:javascript
复制
[self.gradientView.layer addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew context:nil];

然后,只需实现以下方法:

代码语言:javascript
复制
-(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中:

代码语言:javascript
复制
-(void)dealloc{
    [self.gradientView.layer removeObserver:self forKeyPath:@"bounds"];
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27273992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档