15

我正在向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];
4

2 回答 2

33

这里有两种不同的方法来解决您的问题。

  1. 制作gradientLayer实例变量而不是局部变量。然后,layoutSubviews在您的视图类中覆盖以设置渐变层的框架:

    - (void)layoutSubviews {
        [super layoutSubviews];
        _gradientLayer.frame = self.bounds;
    }
    
  2. 创建一个UIViewnamed的子类GradientView,并重写它的+layerClass方法返回[CAGradientLayer class]。使用此视图绘制渐变,而不是直接使用图层。然后设置渐变视图autoresizingMask(如果您使用自动布局,则向其添加约束)。 有关示例,请参见此答案。

创建GradientView类还将使调整大小在旋转期间正常运行,因此我推荐该解决方案。

于 2013-11-18T22:27:01.653 回答
2

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

-(void)setFrame:(CGRect)frame
{
    [super setFrame:frame];
    _gradientLayer.bounds = CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame));
}
于 2013-03-22T23:34:12.573 回答