【问题标题】:How to resize a CAGradientLayer after rotation?旋转后如何调整 CAGradientLayer 的大小?
【发布时间】:2013-03-12 23:03:35
【问题描述】:

我正在向视图添加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];

【问题讨论】:

  • @CodaFi 略有不同的问题。此外,尽管该问题有一个公认的答案,但对于这种情况似乎没有用。
  • 你说得对,这个答案毫无价值。覆盖-layoutSubviews 并在那里分配你的框架。

标签: ios objective-c cocoa-touch cocoa cagradientlayer


【解决方案1】:

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

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

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

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

【讨论】:

  • ♡ 链接的答案。对问题的很好解释(带有动画 gif!)和解决方案。干得好。
  • 附带的链接让解释超级简单!谢谢罗!
【解决方案2】:

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

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

【讨论】:

  • setFrame: 不幸的是,在旋转等事件期间不会调用,所以这不起作用。
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多