2016-12-03 5 views
0

Je développe une application dans laquelle les utilisateurs balaient des «cartes» qui sont essentiellement des UIViews contenant des données provenant d'une API. Lorsque l'application s'ouvre pour la première fois, les cartes sont créées et ajoutées en tant que sous-vues à la vue d'ensemble. Chaque fois qu'un utilisateur balaie, la carte est retirée de la vue d'ensemble. Pendant que l'utilisateur glisse, plus de cartes sont créées et mises en cache en arrière-plan. Lorsque l'utilisateur est sur la dernière carte, j'ajoute les cartes mises en cache à la superposition, derrière la carte qui est actuellement affichée. Le problème est que pendant que les cartes sont ajoutées à la présentation, mon outil de reconnaissance de gestes arrête de fonctionner/des problèmes (l'utilisateur ne peut pas balayer). Après quelques secondes, il recommence à fonctionner et l'utilisateur peut balayer.J'ai des problèmes avec le problème de l'interface utilisateur lors de l'ajout de sous-vues avec les reconnaissances de gestes

Comment empêcher le détecteur de se briser? Toute idée serait appréciée.

Merci!

Voici le code qui crée/ajoute les cartes // Création des cartes func createCards (FirstCall: Bool) {

APICall.begin() { (info) in 

     DispatchQueue.main.async { 
      for i in info { 

       let frontView = frontView() 
       let backView = backView() 

       // Set up front and back views 
       self.viewSetup(view: frontView) 
       self.viewSetup(view: backView) 

       // Set up card view 
       let view = cardView(frame: frame) 
       view.addSubview(backView) 
       view.addSubview(frontView) 
       self.viewSetup(view: view) 
       view.isHidden = true 

       // function that add recognizer 
       self.dragging(view: view) 

       // cacheCard 
       if !firstCall{ 
        self.cache.add(cardView: view) 
       // add to view 
       }else{ 
        self.view.addSubview(view) 
       } 

      } 

      // Reveal current card 
      if firstCall { 
       self.view.subviews.last?.isHidden = false 
      } 

      print("DONE") 
     } 
    } 

} 

Heres le code qui ajoutent les reconnaisseurs/ajoute cache

// dragging gesture helper 
func draggig(card: view){ 
    let gesture = UIPanGestureRecognizer(target: self, action: #selector(ViewController.wasDragged(_:))) 
    view.addGestureRecognizer(gesture) 
    view.isUserInteractionEnabled = true 

} 

// dragged gestrues 
func wasDragged(_ gesture: UIPanGestureRecognizer){ 

    // Only allow dragging when front is showing 
    if(showingFront){ 

     // Dragging code 
     let helper = draggingBeganHelper(gesture: gesture) 
     let card:UIView = helper[0] as! UIView 
     var rotation:CGAffineTransform = helper[1] as! CGAffineTransform 
     var stretch:CGAffineTransform = helper.last as! CGAffineTransform 

     if gesture.state == UIGestureRecognizerState.ended { 

      rotation = CGAffineTransform(rotationAngle: 0) 
      stretch = rotation.scaledBy(x: 1, y: 1) 

      //Remove card from superview 
      card.removeFromSuperview() 

      // Store cards in cache 
      if(self.view.subviews.count == lastCardIndex + cardOffset){ 

       createCards(false) 

      } 

      // When at the second to last card 
      else if self.view.subviews.count == lastCardIndex+1{ 
       if cardCacheArray.isEmpty { 
        createCards(true) 
       } 
       else{ 
        DispatchQueue.main.async { 
         for i in cardCacheArray{ 
          self.view.insertSubview(i, belowSubview: self.view.subviews[lastCardIndex]) 
         } 
         self.cache.empty() 
        } 
       } 
      } 
     } 
    } 

} 

func draggingBeganHelper(gesture: UIPanGestureRecognizer) -> [AnyObject]{ 
    // Card dragging gesture setup 
    let translation = gesture.translation(in: self.view) 
    let card = gesture.view 
    card?.center = CGPoint(x: (card?.center.x)! + translation.x, y: (card?.center.y)! + translation.y) 
    let xFromCenter = (card?.center.x)! - self.view.bounds.width/2 
    let scale = min(100/abs(xFromCenter),1) 
    let rotation = CGAffineTransform(rotationAngle: xFromCenter/200) 
    let stretch = rotation.scaledBy(x: scale, y: scale) 
    card?.transform = stretch 

    return [card!,rotation as AnyObject,stretch as AnyObject] 
} 
+0

Parce que les choses fonctionnent (mais finalement) comme vous le souhaitez, cela signifie probablement que vous avez codé la "ligne de base" à droite. Cela aiderait si vous pouviez poster du code pour que nous puissions le voir. – dfd

+0

@dfd a ajouté le code –

Répondre

0

Compris. Chargement de trop d'UIViews à la fois. Le fait de recycler continuellement deux UIViews