我有一个CALayer背景使用:
CAGradientLayer *bgLayer = [BackgroundLayer blueGradient];
bgLayer.frame = self.view.bounds;
[self.view.layer insertSublayer:bgLayer atIndex:0];
在
- (void)prepareToRotate:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
我使用此行来旋转CALayer背景。
[[[self.view.layer sublayers] objectAtIndex:0] setFrame:self.view.bounds];
我得到的一些撕裂效果并不漂亮,因为图层看起来旋转得不够快,我怎样才能解决这个问题并获得旋转的无缝效果,是否有更好的方法来调整calayer的大小?
谢谢,
编辑:我的所有代码:
.h:
#import <Foundation/Foundation.h>
#import <QuartzCore/QuartzCore.h>
@interface BackgroundLayer : NSObject
+(CAGradientLayer*) greyGradient;
+(CAGradientLayer*) blueGradient;
@end
.m
#import "BackgroundLayer.h"
@implementation BackgroundLayer
//Metallic grey gradient background
+ (CAGradientLayer*) greyGradient {
UIColor *colorOne = [UIColor colorWithWhite:0.9 alpha:1.0];
UIColor *colorTwo = [UIColor colorWithHue:0.625 saturation:0.0 brightness:0.85 alpha:1.0];
UIColor *colorThree = [UIColor colorWithHue:0.625 saturation:0.0 brightness:0.7 alpha:1.0];
UIColor *colorFour = [UIColor colorWithHue:0.625 saturation:0.0 brightness:0.4 alpha:1.0];
NSArray *colors = [NSArray arrayWithObjects:(id)colorOne.CGColor, colorTwo.CGColor, colorThree.CGColor, colorFour.CGColor, nil];
NSNumber *stopOne = [NSNumber numberWithFloat:0.0];
NSNumber *stopTwo = [NSNumber numberWithFloat:0.02];
NSNumber *stopThree = [NSNumber numberWithFloat:0.99];
NSNumber *stopFour = [NSNumber numberWithFloat:1.0];
NSArray *locations = [NSArray arrayWithObjects:stopOne, stopTwo, stopThree, stopFour, nil];
CAGradientLayer *headerLayer = [CAGradientLayer layer];
headerLayer.colors = colors;
headerLayer.locations = locations;
return headerLayer;
}
//Blue gradient background
+ (CAGradientLayer*) blueGradient {
UIColor *colorOne = [UIColor colorWithRed:(120/255.0) green:(135/255.0) blue:(150/255.0) alpha:1.0];
UIColor *colorTwo = [UIColor colorWithRed:(57/255.0) green:(79/255.0) blue:(96/255.0) alpha:1.0];
NSArray *colors = [NSArray arrayWithObjects:(id)colorOne.CGColor, colorTwo.CGColor, nil];
NSNumber *stopOne = [NSNumber numberWithFloat:0.0];
NSNumber *stopTwo = [NSNumber numberWithFloat:1.0];
NSArray *locations = [NSArray arrayWithObjects:stopOne, stopTwo, nil];
CAGradientLayer *headerLayer = [CAGradientLayer layer];
headerLayer.colors = colors;
headerLayer.locations = locations;
return headerLayer;
}
@end
只需通过
调用准备旋转- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
[self prepareToRotate:[[UIApplication sharedApplication] statusBarOrientation] duration:0];
}
并且只包含
[[[self.view.layer sublayers] objectAtIndex:0] setFrame:self.view.bounds];
答案 0 :(得分:2)
我建议在CoreGraphics上使用CAGradientLayer。渲染速度要快得多。对于您的问题,请尝试在轮换之前栅格化您的视图。
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
self.bgLayer.shouldRasterize = YES;
}
实际上,您可以添加子视图而不是新图层。
@interface MyView : UIView
@end
@implementation MyView
+ (Class)layerClass
{
return [CAGradientLayer class];
}
@end
在旧的插入图层部分中,请执行以下操作。
MyView *bgView = [[MyView alloc] initWithFrame:self.view.bounds];
[(CAGradientLayer *)bgView.layer setColors:colors];
bgView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self.view insertSubview:bgView atIndex:0];
(如果需要,可以使用自动布局)
答案 1 :(得分:1)
Coregraphics渐变层比CALayer好得多。 CALayer很慢并且会显示渐变带,而coregraphics会有一个平滑的渐变。这可能就是发生在你身上的原因。
创建一个 - (void)drawRect:(CGRect)rect {function并在那里绘制渐变。它应该照顾你的问题。
这里有很多示例代码。这是一些
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGFloat locations[] = { 0.0, 1.0 };
NSArray *colors = @[(__bridge id) startColor, (__bridge id) endColor];
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) colors, locations);