Frage

Ich versuche, eine UIView-Unterklasse ( „GradientInAnsicht“) zu erstellen, die sich mit einem Gradienten von verschiedenen Farben füllen. Ich habe es umgesetzt durch eine CAGradientLayer als Unterschicht von UIView der Schicht hinzugefügt wird.

Es sah gut aus, aber wenn der Bildschirm gedreht wurde, hat es nicht die Gradientenschicht ändern. Mit einer BOOL-Eigenschaft auf der Schicht Toggle kein Glück zu finden, ich overrode layoutSubviews im GradientInAnsicht.

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

Das funktioniert, aber das Zeug hinter dem GradientInAnsicht noch sichtbar ist während der Geräte Rotation Animation. Was ist der einfachste Weg zu ‚Autoresize‘ dass CAGradientLayer seine übergeordneten Ebene der Grenzen so anzupassen, dass die Animation (wie für UIView automatische Größen) glatt ist?

War es hilfreich?

Lösung

Sie können sich wahrscheinlich mit der Definition der + layerClass Methode auf einem benutzerdefinierten UIView ...

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

Sie können die Schicht in Ihrer Steuerung viewDidLoad () initialisiert werden (oder wo auch immer), so etwas wie ...

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

Andere Tipps

Ich würde:

  1. Zunahme die Größe des Blicks auf das Maximum jeder Dimension im willRotateToInterfaceOrientation Code. . (Zum Beispiel für ein iPhone 320x480 - stellen Sie die dimmt bis 480x480)

  2. In den Grenzen gemäß die neu gedrehten Ansicht in der didRotateFromInterfaceOrientation Funktion.

Dies sollte es so machen, dass die Ansicht groß genug ist, dass so unabhängig davon, wie sie während der Animation ausgerichtet ist, wird es den gesamten Bildschirm bedecken. Es wird nicht „glatt“ werden. - weil die Steigung gedreht werden muß, aber zumindest werden Sie nicht hinter der Schicht in der Mitte der Drehung sehen

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

}

Beachten Sie, dass nur CAGradientLayer als Schichtklasse zurückkehrt funktioniert, wenn Sie die Ansicht Hintergrundfarbe auf transparent gesetzt. Sie müssen die Schicht Hintergrundfarbe setzen, wenn Sie eine andere Farbe als transparent benötigen.

in meinem Fall dieser Arbeit:

[[[view.layer sublayers] objectAtIndex:gradientIndex] setFrame:view.bounds];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top