2016-12-03 3 views
0

ユーザーが基本的にUIViewに「カード」をスワイプしてAPIのデータを入力するアプリを開発しています。ジェスチャー認識ツールを使ってサブビューを追加するときにUIグリッチに問題がある

アプリが最初に開くと、カードが作成され、スーパービューにサブビューとして追加されます。ユーザーがスワイプするたびに、カードはスーパービューから削除されます。

ユーザーがスワイプしている間に、さらに多くのカードが作成され、バックグラウンドでキャッシュされます。

ユーザーが最後のカードを使用している場合、現在表示されているカードの背後にあるキャッシュされたカードをスーパービューに追加します。

カードがスーパービューに追加されている間、私のジェスチャーレコグナイザは動作/グリッチを停止します(ユーザーはスワイプできません)。数秒後に再び動作を開始し、ユーザーはスワイプできます。

どのようにして認識装置のグリッチを止めますか?どんな洞察にも感謝します。

ありがとうございました!

ここで/はカードに //カードを作成 FUNCのcreateCards(firstCall:ブール値)を追加作成するコードです相続人の認識機能を追加するコードは/キャッシュ

// 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] 
} 
を追加{

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") 
     } 
    } 

} 

は、

+0

物事は(最終的に)あなたが望むように機能するため、おそらく "ベースライン"の権利がコーディングされたことを意味します。私たちが見るためにいくつかのコードを投稿することができれば助けになります。 – dfd

+0

@dfdがコードを追加しました –

答えて

0

それを実演しました。あまりにも多くのUIViewを一度に読み込んでいます。 2つのUIViewを連続的にリサイクルする方がはるかに優れています。

関連する問題