2013-03-22 15 views
13

Dodaję CAGradientLayer do widoku. Po automatycznym przeskalowaniu widoku (np. Po obrocie) warstwa gradientowa nie jest zmieniana. Czy gradient można ustawić tak, aby automatycznie zmieniał rozmiar tak samo jak widok? Zauważ też, że używam ograniczeń automatycznego układu w widoku.Jak zmienić rozmiar warstwy CAGradientLayer po obróceniu?

Oto co robię:

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

możliwy duplikat [CALayer autoreizingMask nie dla iOS SDK?] (Http://stackoverflow.com/questions/8600826/calayer-autoresizingmask-not-for-ios-sdk) – CodaFi

+0

@CodaFi Nieco inne pytanie. Ponadto, chociaż istnieje akceptowana odpowiedź na to pytanie, wydaje się to bezużyteczne w tym przypadku. – memmons

+2

Masz rację, ta odpowiedź jest bezwartościowa. Zastąp '-layoutSubviews' i przypisz tam swoje ramki. – CodaFi

Odpowiedz

24

Oto dwa różne sposoby, aby usunąć problem.

  1. Wprowadź gradientLayer zmienną instancji zamiast zmiennej lokalnej. Następnie zastąpić layoutSubviews w swojej klasie widoku, aby ustawić ramkę warstwy gradientu:

    - (void)layoutSubviews { 
        [super layoutSubviews]; 
        _gradientLayer.frame = self.bounds; 
    } 
    
  2. utworzyć podklasę UIView nazwie GradientView i przesłonić jego +layerClass metodę powrotu [CAGradientLayer class]. Użyj tego widoku, aby narysować gradient zamiast bezpośrednio użyć warstwy. Następnie ustaw widok gradientu na autoresizingMask (lub dodaj do niego ograniczenia, jeśli korzystasz z automatycznego układu). See this answer na przykład.

Tworzenie klasy GradientView będzie również zmiany rozmiaru zachowywać się poprawnie podczas obrotu, więc polecam to rozwiązanie.

+0

♡ połączona odpowiedź. Świetne wyjaśnienie problemu (z animowanym gif!) I rozwiązaniem. Dobra robota. – memmons

+0

Dołączony link wyjaśnił bardzo proste wyjaśnienie! Dzięki Rob! –

2

zmienić rozmiar granic warstwa jest ręcznie poprzez nadpisanie metody widoku setFrame::

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

'setFrame:' ​​niestety nie jest wywoływana podczas zdarzeń takich jak rotacja, więc to nie zadziała. – memmons

Powiązane problemy