旋转后如何调整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];
以下是解决问题的两种不同方法。
-
使
gradientLayer
成为一个实例variables而不是局部variables。 然后,覆盖视图类中的layoutSubviews
,设置渐变图层的框架:- (void)layoutSubviews { [super layoutSubviews]; _gradientLayer.frame = self.bounds; }
-
创build名为
GradientView
的UIView
的子类,并覆盖其+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)); }