2015-04-17 2 views
0

настоящее время я использую следующий метод, чтобы установить цвет фона с моей точки зренияИОС цвет фона появляется только на половине экрана в ландшафтном режиме

//Set the background color 
    CAGradientLayer *bgLayer = [BackgroundLayer blueGradient]; <---Calls method below 
    bgLayer.frame = self.view.bounds; 
    //self.view.layer.backgroundColor = [UIColor redColor].CGColor; 
    [self.view.layer insertSublayer:bgLayer atIndex:0]; 

Это, как он получает градиент цвета - это метод называется выше

@implementation BackgroundLayer 
//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 

Теперь в портретном режиме фон выглядит нормально. Однако в ландшафтном режиме он охватывает только половину экрана, а другая половина - белая. Почему это ? И как я могу это исправить. Я попробовал следующее для смены цвета

self.view.layer.backgroundColor = [UIColor redColor].CGColor; 

Вышеупомянутые работы прекрасно подходят как в пейзажном режиме, так и в портретном режиме, но не в градиенте. Любые идеи о том, как я могу заставить градиент работать?

+0

Привет, Джеймс, см. Мое обновление, я размещаю лучший способ справиться с этим – Leo

ответ

2

Легкий способ:

Просто Добавьте это в ViewController

-(void)viewDidLayoutSubviews{ 
    self.bgLayer.frame = self.view.bounds; 
} 

Лучший способ:

Как here Опишите, что вы можете сделать это в этом тесте way.I это с My Xcode, он отлично работает.

  1. Определить вид фона управлять размером

файл .h

#import <UIKit/UIKit.h> 

    @interface BackgrundView : UIView 

    @end 

.m файл

#import "BackgrundView.h"  
    @interface BackgrundView() 
    @end 
    @implementation BackgrundView 
    +(Class)layerClass{ 
     return [CAGradientLayer class]; 
    } 
    @end 

2 Установите, что вы хотите

#import "ViewController.h" 
#import "BackgrundView.h" 
@interface ViewController() 
@property BackgrundView * backgroundview; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.backgroundview = [[BackgrundView alloc] initWithFrame:self.view.frame]; 
    self.backgroundview.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
    [self.view addSubview:self.backgroundview]; 
    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 * graintLayer = (CAGradientLayer *)self.backgroundview.layer; 
    graintLayer.colors = colors; 
    graintLayer.locations = locations; 
} 
+0

self.bgLayer.frame = self.view.bounds; – Duc

0

Правильная строка кода: self.view.backgroundColor = [UIColor redColor];

0

Вы обновляете рамку фонового слоя, когда устройство поворачивается в Пейзаж? Очевидно, ваша проблема может быть решена из ответа в этом вопросе here

0

Вам нужно добавить новый градиент, когда ваше устройство вращается.

- (void)viewDidLayoutSubviews // called when device rotates 
{ 
    [self.bgLayer removeFromSuperlayer]; // you need to keep reference so you can remove the old layer 

    self.bgLayer = [BackgroundLayer blueGradient]; <---Calls method below 
    self.bgLayer.frame = self.view.bounds; 
    [self.view.layer insertSublayer:self.bgLayer atIndex:0]; 
} 

Посмотрите @WenchenHuang ответ, это лучше, чем мой подход.

+0

. BgLayer не имеет метода removeFromSuperLayer –

+0

извините. Это removeFromSuperlayer –

+0

. Я поставил здесь точку останова, и этот метод также вызывается в начале. Не могли бы вы немного объяснить. Что делает этот метод? –

Смежные вопросы