Question

Je suis en train de créer une sous-classe UIView ( « GradientView ») qui se remplir avec un dégradé de couleurs différentes. Je l'ai mis en œuvre en ajoutant un CAGradientLayer comme une sous-couche de la couche de UIView.

Il avait l'air bien, mais quand l'écran est mis en rotation, il n'a pas redimensionne la couche gradient. Avoir pas de chance de trouver une propriété BOOL sur la couche à bascule, je l'emportaient sur layoutSubviews dans le GradientView.

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

Cela fonctionne, mais les choses derrière le GradientView est encore visible lors de l'animation de rotation de l'appareil. Quelle est la meilleure façon de « autoresize » qui CAGradientLayer pour correspondre à ses limites de la couche de parent afin que l'animation est lisse (comme pour UIView Autoresizing)?

Était-ce utile?

La solution

Vous pouvez probablement avec la définition de la méthode + layerClass sur mesure UIView ...

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

Vous pouvez initialiser la couche dans viewDidLoad () (ou chaque fois) de votre contrôleur, quelque chose comme ...

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

Autres conseils

Je voudrais:

  1. Augmenter la taille de votre point de vue à la maximale chaque dimension dans le code willRotateToInterfaceOrientation.

  2. - (Par exemple, pour un iPhone 320x480 mis les DiMS à 480x480).
  3. Définir les limites conformément à la vue nouvellement pivotée dans la fonction didRotateFromInterfaceOrientation.

Cela devrait faire en sorte que la vue est assez grand pour que, peu importe la façon dont elle est orientée au cours de l'animation, il couvrira tout l'écran. Il ne sera pas « lisse » -. Parce que le gradient devra être tourné, mais au moins vous ne verrez pas derrière la couche au milieu de la rotation

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

}

Notez que le retour CAGradientLayer que la classe de couche ne fonctionne que si vous définissez la couleur d'arrière-plan en vue de la transparence. Vous aurez besoin de définir la couleur d'arrière-plan de la couche si vous avez besoin d'une couleur autre que transparent.

dans mon cas ce travail:

[[[view.layer sublayers] objectAtIndex:gradientIndex] setFrame:view.bounds];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top