2014-12-03 32 views
0

我有一个UITableViewCell,它有一个UIViewgradientView),我想应用渐变。此单元格具有AutoLayout,因此我想在gradientView框架更改时更新渐变框架。CAGradientLayer in UITableViewCell

我曾尝试以下,但他们没有工作:

-(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

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

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

+0

你能举例吗? – rob180 2014-12-03 14:56:12

+0

https://github.com/ole/OBGradientView把它放在你的项目中,并使用这个UIView子类。 – rounak 2014-12-03 15:10:47

1

我个人一直使用国际志愿者组织为改变层框架。放置单元格子视图之后放置此行(如果使用IB/storyboard,则为-(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"]; 
} 
+0

工作,我只有一个问题。当我第一次设计表格视图时,渐变适合动画。任何理想为什么? – rob180 2014-12-03 14:55:01

+0

@ rob180 nope,也许'gradienView'或'gradient'框架在开头就是'CGRectZero',所以iOS决定动画这个大的变化? – Kegluneq 2014-12-03 14:59:08

+0

他们不是零,我必须找到一种方法来禁用此动画 – rob180 2014-12-03 15:01:30