2013-03-22 11 views
13

Ich füge eine CAGradientLayer zu einer Ansicht hinzu. Wenn die Ansicht automatisch skaliert wird (z. B. nach einer Drehung), wird die Farbverlaufsebene nicht geändert. Kann der Gradient auf die gleiche Größe wie die Ansicht eingestellt werden? Beachten Sie auch, dass ich automatische Layout-Einschränkungen in der Ansicht verwende.Wie ändert man die Größe einer CAGradientLayer nach der Rotation?

Hier ist, was ich tue:

CAGradientLayer *gradientLayer = [CAGradientLayer layer]; 
    gradientLayer.frame = CGRectMake(0.0, 0.0, frame.size.width, frame.size.height); 
    gradientLayer.colors = [NSArray arrayWithObjects: 
         (id)[[UIColor colorWithRed:255.0/255.0f green:255.0/255.0f blue:255.0/255.0f alpha:1.0f] CGColor], 
         (id)[[UIColor colorWithRed:233.0/255.0f green:233.0/255.0f blue:233.0/255.0f alpha:1.0f] CGColor], nil]; 

    [self.layer insertSublayer:gradientLayer atIndex:0]; 
+0

mögliche Duplikate von [CALayer autoresizingMask nicht für iOS SDK?] (Http://StackOverflow.com/questions/8600826/Calayer-AutoresizingMask-not-for-Iios-SDK) – CodaFi

+0

@CodaFi Etwas andere Frage. Auch wenn es eine akzeptierte Antwort für diese Frage gibt, ist sie für diesen Fall scheinbar nutzlos. – memmons

+2

Sie haben Recht, diese Antwort ist wertlos. Überschreiben Sie "-layoutSubviews" und weisen Sie Ihre Bilder dort zu. – CodaFi

Antwort

24

Hier sind zwei verschiedene Möglichkeiten, um Ihr Problem zu beheben.

  1. Geben Sie gradientLayer eine Instanzvariable anstelle einer lokalen Variablen ein. Dann überschreiben layoutSubviews in der Ansichtsklasse den Rahmen der Gradientenschicht zu setzen:

    - (void)layoutSubviews { 
        [super layoutSubviews]; 
        _gradientLayer.frame = self.bounds; 
    } 
    
  2. Erstellen einer Unterklasse von UIViewGradientView genannt, und außer Kraft setzen ihre +layerClass Methode [CAGradientLayer class] zurückzukehren. Verwenden Sie diese Ansicht, um Ihren Farbverlauf zu zeichnen, anstatt direkt eine Ebene zu verwenden. Legen Sie dann die Verlaufsansicht autoresizingMask fest (oder fügen Sie Einschränkungen hinzu, wenn Sie das automatische Layout verwenden). See this answer für ein Beispiel.

die GradientView Klasse Erstellen wird auch die Größe neu bestimmt richtig während der Rotation machen verhalten, so empfehle ich diese Lösung.

+0

♡ die verknüpfte Antwort. Tolle Erklärung des Problems (mit animiertem Gif!) Und Lösung. Gut gemacht. – memmons

+0

Der mitgelieferte Link machte die Erklärung super einfach! Danke Rob! –

2

ich die Größe der Grenzen manuell die Schicht durch Überschreiben der setFrame: Methode der Ansicht:

-(void)setFrame:(CGRect)frame 
{ 
    [super setFrame:frame]; 
    _gradientLayer.bounds = CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame)); 
} 
+0

'setFrame:' ​​wird leider nicht während Ereignissen wie Rotation aufgerufen, daher wird dies nicht funktionieren. – memmons