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?
Ich sehe keinen "Animationsblock". Worüber redest du? – matt
@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
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