2017-05-22 2 views
0

Je suis peut-être en train de me tromper totalement de direction, mais ce que j'essaye de réaliser est de charger d'abord une vue et d'invoquer des méthodes qui seront exécutées ensuite infiniment, tout en donnant à l'utilisateur la possibilité d'interagir avec cette vue. Ma première supposition était d'utiliser viewDidApper avec UIView.animate, comme ci-dessous;Invoquer une tâche répétable lorsque viewDidApper

class MainView: UIView { 
     ... 
     func animateTheme() { 
      //want this to print out infinitely 
      print("Test") 
     }  
} 

class ViewController: UIViewController {  
    @IBOutlet weak var mainView: MainView!   

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     UIView.animate(withDuration: 1.0, delay: 0.0, options: .repeat, animations: { 
      self.mainView.animateTheme() 
     }, completion: nil)  
    } 
} 

Le cas est que je ne peux voir qu'un seul "Test" imprimé mais cela doit être invoqué à l'infini. Aussi, comme je l'ai mentionné, l'utilisateur doit avoir la possibilité d'interagir avec la vue une fois que tout est chargé.

Merci beaucoup pour votre aide.

Répondre

0

J'ai fait quelque chose de très similaire sur un de mes ViewControllers qui charge un UIWebView. Pendant le chargement de la page Web, je montre un UILabel avec le texte «Chargement» et toutes les 1,5 secondes, j'ajoute un point à la fin du texte. Je pense que l'approche que vous décrivez ci-dessus et la mienne montrée ci-dessous ont le même effet et aucune ne serait considérée comme une boucle infinie.

private func showLoadingMessage(){ 
    let label = loadingLabel ?? UILabel(frame: CGRect.zero) 
    label.text = "Loading" 

    view.addSubview(label) 
    loadingLabel = label 
    addEllipsis() 
} 

private func addEllipsis() { 

    if webpageHasLoaded { return } 
    guard let labelText = loadingLabel?.text else { 
     return 
    } 

    DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) { 
     self.loadingLabel?.text = labelText + "." 
     self.addEllipsis() 
    } 
} 
1

ViewDidAppear seront en effet appelé plus tard lorsque la vue est chargé, mais je pense que ne pas l'utilisateur peut ou aura le temps d'interagir chargés avant que l'irrémédiable.

Si vous souhaitez charger des animations après que tout soit chargé, vous pouvez créer un temporisateur et attendre x secondes avant de le faire. L'exemple ci-dessous sera appelé 10 secondes après l'initiation.

var timer = Timer() 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    timer = Timer.scheduledTimer(timeInterval: 10.0, target: self, selector: #selector(animateSomething), userInfo: nil, repeats: false) 

} 

func animateSomething() { 
    // Animate here 
} 

Mise à jour
Pour faire une boucle infinie, vous pouvez utiliser l'extrait suivant:

UIView.animate(withDuration: 5.0, delay: 0, options: [.repeat, .autoreverse], animations: { 
    self.view.frame = CGRect(x: 100, y: 200, width: 200, height: 200) 
}, completion: nil) 
+0

d'abord je vous remercie beaucoup pour la réponse. J'aurais dû être plus précis sur l'affaire. Ce que je veux réaliser est une situation où tout est chargé pour que l'utilisateur puisse commencer à interagir et qu'il y ait un processus en arrière-plan (de manière infinie), par exemple un objet visible change constamment de couleur. – RafalK

+0

Alors vous voulez faire une animation infinie @RafalK? –

+0

c'est exactement ce dont j'ai besoin :) – RafalK