2017-03-11 3 views
0

Ich möchte alle UIButton/UILabel in einer UIView animieren. Zum Beispiel, dass jede UIButton nacheinander mit einer einzelnen Codezeile eingeblendet wird. Ist das möglich? Ich suchte auf Github, aber ich konnte nichts finden. Ich finde es eine Menge Arbeit, jeden einzelnen UILabel oder UIButton eins nach dem anderen zu animieren. Vielen Dank.Animiere jedes Element in einer UIView

Antwort

1

Sie können es selbst machen, indem Sie über Teilansichten einer UIView iterieren und überprüfen, ob es eine UILabel oder UIButton ist! So etwas wie:

var counter : Double = 0 

func hideSubviews(view:UIView){ 

    for tempView in view.subviews{ 

     let when = DispatchTime.now() + counter 

     if tempView is UIButton || tempView is UILabel{ 

      DispatchQueue.main.asyncAfter(deadline: when) { 

       UIView.animate(withDuration: 1, animations: { 
        //this does fade out, change 0 to 1 for fade in 
        tempView.alpha = 0.0 
       }) 
      } 
     } 
     //increment by gap you want 
     counter += 1 
    } 
} 

bearbeiten:

Sigh ich über dieses viel einfachere Weise vergessen haben, können Sie die Verzögerungseigenschaft in der belebten Funktion:

var counter = 0 

func hideSubviews(view:UIView){ 

    for tempView in view.subviews{ 

     if tempView is UIButton || tempView is UILabel{ 

      UIView.animate(withDuration: 0.3, delay: TimeInterval(counter), options: .init(rawValue: 0), animations: { 

       tempView.alpha = 0.0 

      }, completion: nil) 
     } 

     counter += 1 
    } 
} 

Und dann in Ihrem viewDidAppear oder wo auch immer, rufen Sie einfach die Funktion und übergeben Sie die Ansicht:

override func viewDidAppear(_ animated: Bool) { 

    super.viewDidAppear(animated) 

    hideSubviews(view: view) 
} 
+0

O wow, ich liebe die Tatsache, es jedes UILabel und UIButton dauert nur ohne sie in einem Array an erster Stelle mit. Danke – NoKey

1

Sie könnten eine Funktion als eine einzelne Codezeile, nach der Sie suchen, erstellen und aufrufen, wo Sie ein Array der Schaltflächen oder Beschriftungen hinzufügen, die Sie einblenden möchten. Ich gebe Ihnen ein Beispiel, das Sie einfügen können und es sollte Arbeit. Das einzige, was Sie tun müssen, ist, die UIButton-Ausgänge im Storyboard anzuschließen.

import UIKit 

class ViewController: UIViewController { 

@IBOutlet weak var button1: UIButton! 

@IBOutlet weak var button2: UIButton! 

@IBOutlet weak var button3: UIButton! 

var count = 0 

override func viewDidLoad() { 
    super.viewDidLoad() 

} 

override func viewDidAppear(_ animated: Bool) { 

    let allButtons = [button1, button2, button3] 

    fadeInButtons(buttons: allButtons as! [UIButton]) 

} 

func fadeInButtons(buttons: [UIButton]) { 

    UIView.animate(withDuration: 0.4, animations: { 

      buttons[self.count].alpha = 0 


    }) { (value) in 

     if self.count < buttons.count - 1 { 

      self.count += 1 

      self.fadeInButtons(buttons: buttons) 

     } 

     } 





} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 

Ihre Storyboard mit den Tasten wie diese

Storyboard

aussehen sollte also alles, was Sie tun müssen, ist die Funktion fadeInButtons (Tasten: [UIButton]) aufrufen und ein Array von den Pass Tasten, die Sie einblenden möchten, und es wird eine nach der anderen tun. Sie können dies ändern, um auch Beschriftungen func fadeInButtons (Schaltflächen: [UIButton], Beschriftungen: [UILabel]) einzufügen. Sie können die Zeit jeder Animation ändern, in diesem Beispiel dauert jede Einblendung der Animation 0,4.

2
let duration = 0.5 

view.subviews.flatMap { $0 as? UILabel ?? $0 as? UIButton }.enumerated().forEach { i, o in UIView.animate(withDuration: duration, delay: Double(i) * duration, animations: { o.alpha = 0 }) } 

In "einer" Zeile.

typisierten dies auf meinem Handy so, wenn ich einige Fehler gemacht pls sie fühlen sich frei zu korrigieren :)

+0

wow :) Ich benutze dieses in der Zukunft, danke! – NoKey

+0

nette Kette :) Gibt es einen Grund, die Dauer vorher festzulegen? – silentBob

+0

Der einzige Grund ist, wenn Sie die Dauer ändern möchten, müssen Sie sich nicht um die Verzögerung kümmern :). – Eendje

Verwandte Themen