CALayer在iPhone / iPad上自动调整:如何?

时间:2010-09-09 19:23:26

标签: iphone ipad resize calayer autoresize

我正在尝试创建一个UIView子类(“GradientView”),它将用各种颜色的渐变填充自己。我已经通过添加CAGradientLayer作为UIView层的子层来实现它。

看起来不错,但是当屏幕旋转时,它没有调整渐变层的大小。没有运气在图层上找到BOOL属性进行切换,我在GradientView中覆盖了layoutSubviews。

-(void)layoutSubviews {
    self.gradientLayer.frame = self.bounds;
}

这样可行,但在设备旋转动画期间,GradientView背后的内容仍然可见。 “自动调整”CAGradientLayer以匹配其父图层边界的最简单方法是什么,以便动画流畅(如UIView自动调整)?

5 个答案:

答案 0 :(得分:29)

您可以在自定义UIView ...

上定义+ layerClass方法
@implementation MyGradientView
+(Class) layerClass {
    return [CAGradientLayer class];
}
@end

您可以在控制器的viewDidLoad()(或任何地方)中初始化图层,例如......

-(void)viewDidLoad {
    [super viewDidLoad];
    [(CAGradientLayer*)[mMyGradientViewInstance layer] setColors:nil];
}

答案 1 :(得分:4)

我会:

  1. 将视图大小增加至willRotateToInterfaceOrientation代码中每个维度的最大。 (例如,对于320x480的iPhone - 将调光设置为480x480)。

  2. 根据didRotateFromInterfaceOrientation函数中新轮换的视图设置边界。

  3. 这应该使视图足够大,以便无论在动画期间它如何定向,它都将覆盖整个屏幕。它不会“平滑” - 因为渐变必须旋转,但至少你不会在旋转中间看到层后面。

答案 2 :(得分:2)

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    CGRect b;

    if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation))b = CGRectMake(0, 0, 480, 320);
    else b = CGRectMake(0, 0, 320, 480);    

    [CATransaction begin];
    [CATransaction setValue:[NSNumber numberWithFloat:duration] forKey:kCATransactionAnimationDuration];
    [self.view.layer setBounds:b];
    [CATransaction commit];

}

答案 3 :(得分:1)

请注意,只有将视图背景颜色设置为透明,才能将CAGradientLayer作为图层类返回。如果您需要透明以外的颜色,则需要设置图层背景颜色。

答案 4 :(得分:0)

就我而言这项工作:

[[[view.layer sublayers] objectAtIndex:gradientIndex] setFrame:view.bounds];