Подтвердить что ты не робот

CALayer autoresizing на iPhone/iPad: Как?

Я пытаюсь создать подкласс UIView ( "GradientView" ), который заполнит собой градиент различных цветов. Я реализовал его, добавив CAGradientLayer в качестве подслоя слоя UIView.

Это выглядело хорошо, но когда экран был повернут, он не изменял размер слоя градиента. Не повезло найти свойство BOOL на слое для переключения, я перепробовал layoutSubviews в GradientView.

-(void)layoutSubviews {
    self.gradientLayer.frame = self.bounds;
}

Это работает, но материал за GradientView все еще отображается во время анимации вращения устройства. Каков самый простой способ "авторизовать", что CAGradientLayer соответствует границам его родительского слоя, чтобы анимация была гладкой (например, для авторезистировки UIView)?

4b9b3361

Ответ 1

Возможно, вам удастся определить метод + layerClass в пользовательском UIView...

@implementation MyGradientView
+(Class) layerClass {
    return [CAGradientLayer class];
}
@end

Вы можете инициализировать слой в вашем контроллере viewDidLoad() (или где угодно), что-то вроде...

-(void)viewDidLoad {
    [super viewDidLoad];
    [(CAGradientLayer*)[mMyGradientViewInstance layer] setColors:nil];
}

Ответ 2

Я бы:

  • Увеличьте размер вашего представления до максимум каждого в коде willRotateToInterfaceOrientation. (Например, для iPhone 320x480 - установите яркость на 480x480).

  • Задайте границы в соответствии с вновь повернутым представлением в функции didRotateFromInterfaceOrientation.

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

Ответ 3

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    CGRect b;

    if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation))b = CGRectMake(0, 0, 480, 320);
    else b = CGRectMake(0, 0, 320, 480);    

    [CATransaction begin];
    [CATransaction setValue:[NSNumber numberWithFloat:duration] forKey:kCATransactionAnimationDuration];
    [self.view.layer setBounds:b];
    [CATransaction commit];

}

Ответ 4

Обратите внимание, что возврат CAGradientLayer в качестве класса слоя работает только при условии, что цвет фона представления прозрачен. Вам нужно установить цвет фона слоя, если вам нужен цвет, отличный от прозрачного.

Ответ 5

в моем случае эта работа:

[[[view.layer sublayers] objectAtIndex:gradientIndex] setFrame:view.bounds];