2016-11-28 25 views
0

別のボタンを押した後、スクロールビューにボタンを動的に追加しようとしています。Swiftのforループを使用してUIButtonを動的に作成

スクロールビューに追加するカスタムUIViewを作成しました。あなた以下

私はそれをやろうとしていますどのようにコードを見つけることができます。

var buttonY: CGFloat = 0 // our Starting Offset, could be 0 
      for _ in audioCommentsArray { 
       UIView.animateWithDuration(0.15, animations: { 

        let commentView = AudioCommentView(frame: CGRectZero) 
        commentView.frame = CGRect(x: 0, y: buttonY, width: 75, height: 75) 

        buttonY = buttonY + 75 // we are going to space these UIButtons 75px apart 

        commentView.alpha = 1.0 

        audioCommentsListScrollView.addSubview(commentView) 
       }) 
      } 

私は単純なアニメーションを使用して、これらのcommentView年代を追加したいです。上記のビューは、このように追加されるのに対し、しかし最後commentViewがscrollViewに正しく追加されている:

enter image description here

他の要素が表示されていないのに対し、commentViewの背景のみが示されています。

私には何が欠けているのでしょうか? forループを使用してビューを追加することは、これまで何度もやっているので複雑ではありませんが、今回は何かを見逃しているようです。

ありがとうございます!

+0

私はUIViewアニメーションをループし、キーフレームアニメーションを最初に使用しなかった理由を理解しようとしています。 1つのビューが表示され、次のビューが0.15秒後に表示されますか? – gwinyai

+0

はい、それはUIViewアニメーション@gwinyaiの背後にあるアイデアでした – Granit

答えて

1

UIViewアニメーションは、ループを介して処理する際に、重なり合って干渉し合います。代わりに、次のアニメーションが他のアニメーションと干渉しないように、それらを連鎖させる必要があります。ループを削除します。次に、完了ハンドラでアニメーションを順番に呼び出します。再帰的に呼び出すことで、各ボタンがアニメ化されるようにすることができます。

var count = 0 

    func startButtonsAnimation() { 

    UIView.animateWithDuration(0.15, animations: { 

       let commentView = AudioCommentView(frame: CGRectZero) 
       commentView.frame = CGRect(x: 0, y: buttonY, width: 75, height: 75) 

       buttonY = buttonY + 75 // we are going to space these UIButtons 75px apart 

       commentView.alpha = 1.0 

       audioCommentsListScrollView.addSubview(commentView) 
      }, completion: { (value: Bool) in 
         if self.count < self.audioCommentsArray.count { 
          self.count += 1 
          self.startButtonsAnimation() 
         } 
    }) 
+0

ボタンを静的に追加したいのであれば、あなたのソリューションはうまくいくようですが、私はもともと私のaudioCommentsArrayで持っていた要素の数に応じてチェーンしますか? @gwinyai – Granit

+0

申し訳ありません。私はそれを忘れてしまった。コードを関数に追加しました。各アニメーションは連鎖されますが、次は再帰的に呼び出され、countがaudioCommentsArrayの要素数と等しくなるまで続きます。 – gwinyai

+0

ありがとう!これは私の問題を解決した:D – Granit

関連する問題