2017-01-22 2 views
-2

Ich möchte CAGradientLayer in meiner App verwenden. Ich bin ein CAGradientLayer bei Index 0 der Subschichten Ansicht des Viewcontroller Einfügen:Unteransicht der animierten Ansicht funktioniert nicht mit CAGradientLayer

class ViewController: UIViewController { 
var label: UILabel! 

override func viewDidLoad() { 
    let width = view.frame.size.width 
    let height = view.frame.size.height 
    super.viewDidLoad() 
    label = UILabel(frame: CGRect(x: 30, y: 80, width: width/4, height: height/20)) 
    label.backgroundColor = UIColor.yellow 
    label.textColor = UIColor.white 
    label.text = "label" 
    label.alpha = 0 
    view.addSubview(label) 
    let hideButton = UIButton.init(type: .system) 
    hideButton.frame = CGRect(x: width/2 - 15, y: label.frame.origin.y + 50, width: width/4, height: 30) 
    hideButton.setTitle("Hide", for: .normal) 
    hideButton.backgroundColor = UIColor.red 
    hideButton.addTarget(self, action: #selector(ViewController.fadeOutLabel), for: .touchUpInside) 
    view.addSubview(hideButton) 

    let gradientButton = UIButton.init(type: .system) 
    gradientButton.frame = CGRect(x: width/2 - 15, y: hideButton.frame.origin.y + 50, width: width/4, height: 30) 
    gradientButton.setTitle("add gradient", for: .normal) 
    gradientButton.backgroundColor = UIColor.red 
    gradientButton.addTarget(self, action: #selector(ViewController.updateSubviews), for: .touchUpInside) 
    view.addSubview(gradientButton) 

} 

func updateSubviews() { 
    UIView.animate(withDuration: 0.3, animations: { 
     self.label.alpha = 1 
     let gradientSublayer = self.makeGradientLayer() 
     self.view.layer.insertSublayer(gradientSublayer, at: 0) 
     }, completion: nil) 
} 

func makeGradientLayer() -> CAGradientLayer{ 
    let gradientLayer = CAGradientLayer() 
    gradientLayer.frame = UIScreen.main.bounds 
    let primaryColor = UIColor.yellow 
    let secondaryColor = UIColor.green 
    gradientLayer.colors = [primaryColor.cgColor, secondaryColor.cgColor] 
    return gradientLayer 
} 

func fadeOutLabel(){ 
    print("touch received") 
    UIView.animate(withDuration: 0.3, animations: { 
     self.label.alpha = 0 
     }) { (finished) in 
      print("animation finished") 
    } 
} 

}

Ich habe jedoch andere UI-Elemente auf einem Bildschirm, und sie sind sichtbar, aber wenn ich versuche, einige hinzufügen Animationen (animieren Label Alpha beim Tippen auf eine Schaltfläche oder Ändern des Textes), es funktioniert nicht. Der Selektor der Schaltfläche wird ausgelöst, und der Animationsblock wird ausgeführt ... aber nichts passiert. Ich habe die naheliegendste Lösung ausprobiert - eine separate Ansicht zu erstellen und sie als Unteransicht hinzuzufügen, aber das Ergebnis wird sich nicht ändern. Alle Untersichten auf dem Controller werden der Hauptansicht in der viewDidLoad hinzugefügt. Vielleicht vermisse ich etwas an CALayers?

+0

Ich sehe keinen "Animationsblock". Worüber redest du? – matt

+0

@matt Ich spreche über UIView.animate (withDuration: <# T ## TimeInterval #>, Animationen: <#T##() -> Void #>), die nur an einer anderen Stelle im Code ist. Es feuert vom Fass, aber Subviews passiert nichts. Zum Beispiel setze ich label.alpha im Animationsblock auf 0, und diese Zeile wird gerade ausgeführt. Aber dem Label passiert wirklich nichts, es ist immer noch sichtbar! – Kmkrn

+0

Sie müssen jedoch den _actual code_ in der _question_ anzeigen. Ich muss in der Lage sein, das Problem zu reproduzieren, um es zu beheben. Also zeige mehr von deinem Code. – matt

Antwort

0

In meinem ursprünglichen Code habe ich Etiketten und andere Unteransichten in viewWillLayoutSubviews() hinzugefügt. Ich habe alles auf viewDidLoad() verschoben und Animationen begannen zu arbeiten. Leider konnte ich das in einem Beispielprojekt nicht reproduzieren. Ich bin mir immer noch nicht sicher, ob ich falsch lag.

0

In meinem ursprünglichen Code wurde hinzugefügt ich Etiketten und andere Subviews in viewWillLayoutSubviews()

Eine Sache im Auge zu behalten ist, dass viewWillLayoutSubviewsviele, viele Male über die gesamte Lebensdauer der App aufgerufen wird. Möglicherweise haben Sie also immer wieder "Labels und andere Unteransichten hinzugefügt". Das klingt nicht gut.

Verwandte Themen