0

我有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{}
4

2 回答 2

2

就我个人而言,我总是使用 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 块中,因为没有它,层不会更新。

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

-(void)dealloc{
    [self.gradientView.layer removeObserver:self forKeyPath:@"bounds"];
}
于 2014-12-03T14:35:03.887 回答
1

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

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

于 2014-12-03T14:49:57.190 回答