我正在尝试创建一个UIView子类(“GradientView”),它将用各种颜色的渐变填充自己。我已经通过添加CAGradientLayer作为UIView层的子层来实现它。
看起来不错,但是当屏幕旋转时,它没有调整渐变层的大小。没有运气在图层上找到BOOL属性进行切换,我在GradientView中覆盖了layoutSubviews。
-(void)layoutSubviews {
self.gradientLayer.frame = self.bounds;
}
这样可行,但在设备旋转动画期间,GradientView背后的内容仍然可见。 “自动调整”CAGradientLayer以匹配其父图层边界的最简单方法是什么,以便动画流畅(如UIView自动调整)?
答案 0 :(得分:29)
您可以在自定义UIView ...
上定义+ layerClass方法@implementation MyGradientView
+(Class) layerClass {
return [CAGradientLayer class];
}
@end
您可以在控制器的viewDidLoad()(或任何地方)中初始化图层,例如......
-(void)viewDidLoad {
[super viewDidLoad];
[(CAGradientLayer*)[mMyGradientViewInstance layer] setColors:nil];
}
答案 1 :(得分:4)
我会:
将视图大小增加至willRotateToInterfaceOrientation代码中每个维度的最大。 (例如,对于320x480的iPhone - 将调光设置为480x480)。
根据didRotateFromInterfaceOrientation函数中新轮换的视图设置边界。
这应该使视图足够大,以便无论在动画期间它如何定向,它都将覆盖整个屏幕。它不会“平滑” - 因为渐变必须旋转,但至少你不会在旋转中间看到层后面。
答案 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];