如何在轮换后调整CAGradientLayer的大小?

mem*_*ons 13 cocoa cocoa-touch objective-c ios cagradientlayer

我正在添加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];
Run Code Online (Sandbox Code Playgroud)

rob*_*off 31

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

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

    - (void)layoutSubviews {
        [super layoutSubviews];
        _gradientLayer.frame = self.bounds;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个UIViewnamed 的子类GradientView,并覆盖其+layerClass返回的方法[CAGradientLayer class].使用此视图绘制渐变而不是直接使用图层.然后设置渐变视图autoresizingMask(如果使用自动布局,则为其添加约束). 请参阅此答案以获取示例.

创建GradientView类也会使旋转期间的大小调整正确,所以我建议使用该解决方案.