0

私は以下を使用して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];

レイヤーが十分に速く回転していないように見えるため、きれいではない引き裂き効果が得られます。これを修正して、回転時にシームレスな効果を得るにはどうすればよいですか?キャレイヤーのサイズを変更するより良い方法はありますか?

ありがとう、

編集:すべての私のコード:

.h:

#import <Foundation/Foundation.h>
#import <QuartzCore/QuartzCore.h>


@interface BackgroundLayer : NSObject

+(CAGradientLayer*) greyGradient;
+(CAGradientLayer*) blueGradient;

@end

彼ら

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

4

2 に答える 2

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

(必要に応じて自動レイアウトを使用できます)

于 2013-06-24T18:19:42.490 に答える
1

Coregraphics グラデーション レイヤーは、CALayer よりもはるかに優れています。CALayer は遅く、グラデーション バンドを表示しますが、coregraphics は滑らかなグラデーションになります。これがおそらくあなたに起こっている理由です。

-(void)drawRect:(CGRect)rect { 関数を作成し、その下にグラデーションを描画します。それはあなたの問題を処理する必要があります。

このためのサンプルコードがたくさんあります。ここにいくつかあります

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);
于 2013-06-24T17:47:36.003 に答える