旋转后如何调整CAGradientLayer的大小?

我正在添加一个CAGradientLayer到一个视图。 当视图自动resize时(例如旋转后),渐变图层不会resize。 可以将渐变设置为自动调整视图相同吗? 还要注意,我在视图中使用自动布局约束。

这是我正在做的事情:

  CAGradientLayer *gradientLayer = [CAGradientLayer layer]; gradientLayer.frame = CGRectMake(0.0, 0.0, frame.size.width, frame.size.height); gradientLayer.colors = [NSArray arrayWithObjects: (id)[[UIColor colorWithRed:255.0/255.0f green:255.0/255.0f blue:255.0/255.0f alpha:1.0f] CGColor], (id)[[UIColor colorWithRed:233.0/255.0f green:233.0/255.0f blue:233.0/255.0f alpha:1.0f] CGColor], nil]; [self.layer insertSublayer:gradientLayer atIndex:0]; 

以下是解决问题的两种不同方法。

  1. 使gradientLayer成为一个实例variables而不是局部variables。 然后,覆盖视图类中的layoutSubviews ,设置渐变图层的框架:

     - (void)layoutSubviews { [super layoutSubviews]; _gradientLayer.frame = self.bounds; } 
  2. 创build名为GradientViewUIView的子类,并覆盖其+layerClass方法返回[CAGradientLayer class] 。 使用此视图绘制您的渐变,而不是直接使用图层。 然后设置渐变视图的autoresizingMask (或者如果使用自动布局,则添加约束)。 看到这个答案的例子。

创buildGradientView类也将使旋转过程中resize的行为正确,所以我build议解决scheme。

我通过覆盖视图的setFrame:方法来手动调整图层的边界大小:

 -(void)setFrame:(CGRect)frame { [super setFrame:frame]; _gradientLayer.bounds = CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame)); }