2010-11-22 13 views
14

ich eine Steigung entfernende Schicht hinzugefügt haben:einen CALayer bei Index 0

[theView.layer insertSublayer:gradient atIndex:0]; 

Und später in einem anderen Verfahren möchte ich diese Schicht entfernen. Ich dachte, ich sollte das Array von Sublayern bekommen, dann den Sublayer auf Index 0 bringen und removeFromSuperlayer darauf aufrufen. Ist das der richtige Weg oder wenn nicht können Sie es tun?

Prost.

Antwort

17

Sie können es tun, wie Sie beschrieben haben, aber es ist nicht so zuverlässig. Das Problem ist, dass wenn Sie etwas mit den Sublayern zwischen dem Hinzufügen und Entfernen tun, der Index des Sublayers sich ändern kann und Sie am Ende etwas entfernen, was Sie nicht wollten.

Das Beste ist, einen Verweis auf diese Ebene zu halten und später, wenn Sie es entfernen wollen rufen Sie einfach [theLayer removeFromSuperlayer]

Hoffe, dass es

+0

Ich hatte Angst davor :( – Rudiger

8

Funfunfun hilft ...

Es gibt zwei Schichteigenschaften Sie können (in jedem Fall, dass Sie über die Schichten zu durchlaufen haben) verwenden:

  • CALayer.name „von einigem Layout-Manager verwendet, um eine Laye zu identifizieren r ". Stellen Sie es auf etwas, das garantiert eindeutig ist (z. B. "MyClassName.gradient").
  • CALayer.style ist ein Wörterbuch. Sie können Schlüssel verwenden, die nicht von CoreAnimation verwendet werden (z. B. NSMutableDictionary * d = [NSMutableDictionary dictionaryWithDictionary:layer.style]; [d setValue:[NSNumber numberWithBool:YES] forKey:@"MyClassName.gradient"]; layer.style = d;). Dies kann nützlich sein, um beliebige Daten einer Ansicht zuzuordnen (z. B. den Indexpfad der Zelle, die ein Textfeld enthält ...).

(Ich gehe davon aus, dass [NSDictionary dictionaryWithDictionary:nil] das leere Wörterbuch nil statt Rückkehr gibt oder eine Ausnahme zu werfen. Die entsprechende Sache für [NSArray arrayWithArray:nil] wahr ist.)

jedoch die zusätzliche Komplexität des Codes, Leistungseinbußen und Die Wahrscheinlichkeit, es falsch zu machen, überwiegt wahrscheinlich die kleine Verringerung des Speicherverbrauchs. 4 Bytes pro Ansicht ist nicht so viel, wenn Sie eine Handvoll Ansichten haben (und selbst wenn Sie Lasten haben, sind 4 Bytes der Speicher, der von einem einzelnen Pixel verwendet wird!).

+0

Interessanterweise könnte der Name CALayer nützlich sein, wie ich es leicht eindeutig identifizieren konnte, aber wie Sie sagten, die zusätzliche Codierung und Leistung aufgrund Schleifen durch alle Ebenen in der Ansicht, um die eine zu finden basierend auf dem Namen vs der etwas mehr Speicher ist es wahrscheinlich nicht wert. Das und ich habe bereits den anderen Weg umgesetzt. Gut zu wissen für die Zukunft obwohl – Rudiger

3

Old Post .. aber jemand für hilfreich sein kann ...

Meine Implementierung des Entfernens/a CALayer ersetzen. Verwenden Sie den Calayer.name als TC. beschreibt oben.

CAGradientLayer *btnGradient = [CAGradientLayer layer]; 
btnGradient.frame = button.bounds; 
btnGradient.name = @"gradient"; 
btnGradient.colors = nil; 
btnGradient.colors = [NSArray arrayWithObjects: 
         (id)[[VOHelper getButtonColor:kSchemeBorder] CGColor], 
         (id)[[VOHelper getButtonColor:kSchemeButton] CGColor], 
         nil]; 

if ([[[[button.layer sublayers] objectAtIndex:0] name] isEqualToString:@"gradient"]){ 
     [button.layer replaceSublayer:[[button.layer sublayers] objectAtIndex:0] with:btnGradient]; 
} 
else{ 
    [button.layer insertSublayer:btnGradient atIndex:0]; 
} 
2

Swift hat einige wirklich einfache Lösungen:

if self.yourView.layer.sublayers!.count > 1 { 
    // Will remove the last sublayer 
    self.yourView.layer.sublayers!.popLast() 
    // Will remove the layer at specified index 
    self.yourView.layer.sublayers!.removeAtIndex(1) 
} 

Denken Sie daran, die Unterschichten als Array behandelt, wenn Sie also eine Anzahl von 2, dann 2 == 1 in der Index, daher removeAtIndex(1).

Es gibt eine ganze Reihe von Optionen zum Bearbeiten von Sublayern. Höre einfach auf, nach sublayers!. zu tippen und sieh sie dir an.

Verwandte Themen