2017-04-26 8 views
0

私はキーボードの通知を受けていますが、それが消えるとプレースホルダビューが検索バーの左端にアニメーション表示されるようにしたいと思います。UIViewアニメーションがNSLayoutConstraintで機能しませんか?

以下は、キーボードのオープニングと非同期のアニメーションを呼び出すために使用するものです。現在、ビューは私が望む場所に移動しますが、アニメーション化するのではなくテレポートしているかのように見えます。

 DispatchQueue.main.async { 
      if isKeyboardShowing { 
       UIView.animate(withDuration: 2, delay: 1, options: UIViewAnimationOptions.curveEaseOut, animations: { 
        NSLayoutConstraint(item: self.placeholder, attribute: .left, relatedBy: .equal, toItem: self.searchBar, attribute: .left, multiplier: 1, constant: 5).isActive = true 
       }, completion: { (completed) in 

       }) 

      } 
     } 

どのような提案ですか?

答えて

1

制約のあるアニメーションはややこしいかもしれません。まず、アニメーションの閉鎖の外に、望ましい制約を調整する必要があります。

NSLayoutConstraint(item: self.placeholder, attribute: .left, relatedBy: .equal, toItem: self.searchBar, attribute: .left, multiplier: 1, constant: 5).isActive = true 

制約の変更は、他のビューが自分の位置を変更引き起こす可能性があるので、あなたはそのサブビューをレイアウトする(ほとんどの場合、VC-ビュー)スーパーを頼む必要があります

UIView.animate(withDuration: 2, delay: 1, options: UIViewAnimationOptions.curveEaseOut, animations: { 
     self.view.layoutIfNeeded() 
}, completion: nil) 

したがって、スーパービューはアニメーションブロック内のサブビューポジションを調整します。

0

NSLayoutConstraintをアニメーション化するには、setNeedsLayout()をアニメーションブロックに入れる必要があります。あなたはそのようにのようなアニメーションブロックの上に

NSLayoutConstraint(item: self.placeholder, attribute: .left, relatedBy: .equal, toItem: self.searchBar, attribute: .left, multiplier: 1, constant: 5).isActive = true 

を移動する必要があります役立ちます

NSLayoutConstraint(item: self.placeholder, attribute: .left, relatedBy: .equal, toItem: self.searchBar, attribute: .left, multiplier: 1, constant: 5).isActive = true 
UIView.animate(withDuration: 2, delay: 1, options: UIViewAnimationOptions.curveEaseOut, animations: { 
    self.layoutIfNeeded() 
}, completion: { (completed) in 

}) 

希望を!

関連する問題