2014-01-04 4 views
3

У меня есть градиент фона, который красиво рисует, когда экран изначально отображается в портретном режиме. Однако, когда устройство повернуто в альбомный режим, правый 40% экрана черный (т. Е. Фон не нарисован на той части экрана, которая ранее не была нарисована). Я не знаю, как получить фон для перерисовки, чтобы заполнить весь экран.Невозможно получить градиент фона для заполнения всего экрана при вращении

Может ли кто-нибудь сказать мне, что я делаю неправильно? Благодаря!

Вот как это выглядит, когда изначально нарисовано. enter image description here

И вот теперь он выглядит, когда я поворачиваю его:

enter image description here

Вот код для моего фона градиента класса:

#import "BackgroundGradient.h" 

@interface BackgroundGradient() 
@property (strong, nonatomic) UIView *view; 
@end 

@implementation BackgroundGradient 

- (id) initWithView:(UIView *) view 
{ 
    if (!_view) 
     _view = view; 

    return self; 
} 

- (void) makeGradient 
{ 
    UIColor *darkOp = [UIColor colorWithRed:(193.0/255.0) green:(215.0/255.0) blue:(46.0/255.0) alpha: 1]; 
    UIColor *lightOp = [UIColor colorWithRed:(222.0/255.0) green:(233.0/255.0) blue:(143.0/255.0) alpha: 1]; 

    // Create the gradient 
    CAGradientLayer *gradient = [CAGradientLayer layer]; 

    // Set colors 
    gradient.colors = [NSArray arrayWithObjects: 
         (id)darkOp.CGColor, 
         (id)lightOp.CGColor, 
         (id)darkOp.CGColor, 
         nil]; 

    // Update the start and end points 
    gradient.startPoint = CGPointMake(0.5, 0.0); 
    gradient.endPoint = CGPointMake(0.5, 1.0); 

    // Set bounds 
    gradient.frame = self.view.bounds; 

    // Add the gradient to the view 
    [self.view.layer insertSublayer:gradient atIndex:0]; 

    gradient.locations = [NSArray arrayWithObjects: 
          [NSNumber numberWithFloat:0.0f], 
          [NSNumber numberWithFloat:0.7], 
          [NSNumber numberWithFloat:0.9], 
          nil]; 

} 

@end 

И, наконец, вот как я экземпляр фонового объекта:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.background = [[BackgroundGradient alloc] initWithView:self.view]; 
    [self.background makeGradient]; 

} 

EDIT: Я добавил следующий код и включены обновления для начальных и конечных точек (выше):

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    [self.background makeGradient]; 
} 

Я почти там, но теперь, я получаю это. Обратите внимание, что по-прежнему существует вертикальная линия. Мне кажется, что новый фон нарисован behing предыдущий фон, чтобы предыдущий фон все еще присутствовал и блокирует новый фон. Это особенно заметно, когда происходит анимация от портрета к пейзажу.

enter image description here

+0

Вы перерисовки градиент (от 'willAnimateRotationToInterfaceOrientation: продолжительность:', возможно), так что он получает новый повернутый кадр ? –

+0

Нет. Это то, за чем я застрял. Как мне это сделать? – Alex

+0

Вы пробовали какие-либо методы компоновки VC для обновления фрейма? – Wain

ответ

2

Это где вы делаете это неправильно: CAGradientLayer *gradient = [CAGradientLayer layer]; и [self.view.layer insertSublayer:gradient atIndex:0];

Вы «adding'a новый экземпляр градиентного слоя каждый раз, когда вращается устройство. Вы не должны этого делать. Вместо этого установите только поворот кадра, и все будет работать нормально. Используйте только один экземпляр. Создайте его в viewDidLoad

Использовать просмотр отладки, чтобы помочь в таких случаях.

+0

Вот и все. Благодаря! – Alex

+1

Думаю, вы спасли меня пару часов)) Thx! –

3

Я решил эту проблему следующим образом: Изменение размера подуровня моего фонового изображения.

Swift рамка

override func willAnimateRotationToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { 
    self.backgroundImageView.layer.sublayers?.first?.frame = self.view.bounds 

} 
1

Обновление градиента в viewDidLayoutSubviews:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    // find gradient layer 
    let gradLayers = gradientView.layer.sublayers?.flatMap { $0 as? CAGradientLayer } 
    // this assumes there is only one gradient layer 
    gradLayers?.first?.frame = gradientView.bounds 
} 
Смежные вопросы