如何调整旋转后CAGradientLayer?(How to resize a CAGradient

2019-07-22 19:42发布

我加入一个CAGradientLayer到视图。 当视图是自动调整大小(例如,旋转后)的梯度层不调整大小。 可以在梯度设置为自动调整大小一样的看法? 还要注意,我使用的视图自动布局约束。

下面是我在做什么:

    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];

Answer 1:

这里有两种不同的方式来解决你的问题。

  1. gradientLayer实例变量,而不是一个局部变量。 然后,重写layoutSubviews在您的视图类来设置梯度层的帧:

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

创建GradientView类也将调整大小旋转过程中行为正确,所以我建议的解决方案。



Answer 2:

我手动调整层的边界通过重写setFrame:视图的方法:

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


文章来源: How to resize a CAGradientLayer after rotation?