2013-06-24 2 views
0

У меня есть фон CALayer с помощью: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 ?

Спасибо,

EDIT: Весь мой код:

заголовочных:

#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 подслои] objectAtIndex: 0] setFrame: self.view.bounds];

ответ

2

Я бы рекомендовал использовать CAGradientLayer поверх CoreGraphics. Это намного быстрее сделать. Для вашей проблемы попробуйте растрировать ваше представление перед вращением.

- (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]; 

(Вы можете использовать автоматическую раскладку, если вы хотите)

+0

, к сожалению, не работает, что делает shouldRasterize делать? I alraedy имеет a - (void) willAnimateRotationToInterfaceOrientation: (UIInterfaceOrientation) toInterfaceOrientation duration: (NSTimeInterval) duration метод, который, как я думаю, превосходит WillRotateToInterface ... – Woodstock

+0

Примечание. Свойство frame не является непосредственно анимированным. Вместо этого вы должны анимировать соответствующую комбинацию границ, свойств anchorPoint и position для достижения желаемого результата. –

1

Уровни градиента Coregraphics намного лучше, чем CALayer. CALayer медленный и покажет полосы градиента, в то время как coregraphics будет иметь плавный градиент. Вероятно, поэтому это происходит с вами.

Создать a (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);