Вопрос

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

Он выглядел хорошо, но когда экран вращался, он не разместил уровень градиента. Неучимся найти свойство Bool на слое для переключения, я переопределяю LayoutSubViews в GradientView.

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

Это работает, но материал за градиентом, все еще виден во время анимации вращения устройства. Каков самый простой способ «авторизовать», что Cagradentlayer, чтобы сопоставить границы своего родительского уровня, чтобы анимация была гладкой (например, для UIVIEW AutoSingsing)?

Это было полезно?

Решение

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

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

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

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

Другие советы

Я бы:

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

  2. Установите границы в соответствии с вновь повернутым видом в функции дидротатферзвентификации.

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

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

}

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

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

[[[view.layer sublayers] objectAtIndex:gradientIndex] setFrame:view.bounds];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top