2017-09-25 14 views
1

私はUIViewControllerの可視範囲外のボタンをアニメーション化しようとしています。私はアニメーションの一部として削除するmyButtonLeadingと呼ばれるストーリーボードに制約設定をしてから、newCenterConstraintという新しい制約を追加したいと思います。ビューに制約をインストールできないのはなぜですか?

@IBAction func updateDidTouch(_ sender: Any) { 

    UIView.animate(withDuration: 0.5, delay: 0, options: UIViewAnimationOptions.curveEaseInOut, animations: { 

     let newCenterConstraint = NSLayoutConstraint(item: self.myButton, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1.0, constant: 0.0) 

     self.myButton.removeConstraint(self.myButtonLeading) 
     self.myButton.addConstraint(newCenterConstraint) 

     self.view.layoutIfNeeded() 

    }, completion: nil) 
} 

私は今私にtoItem: viewに私の参照については、次のエラーメッセージを与えているコード。

閉包で 'self'を暗黙的に使用。 「自己」を使用してください。

ビュー上の制約をインストールすることができません:私は言ってエラーメッセージを表示してself.view私のアプリのクラッシュを使用する場合、キャプチャ セマンティクス明示

を作るだけに。制約の参照は、ビューのサブツリー外のものを参照しますか? それは違法です。

ここで私は新しいcenterX制約を追加する際に間違っていますか?

+0

がself.viewに関連するボタンのスーパーですか? – CZ54

答えて

3

エラーは非常に明確です。 self.viewを参照する制約をサブビューself.viewに追加しています。 、

self.view.addConstraint(newCenterConstraint) 

ルーフランコにより示唆されるように、より良いアプローチはしかし、代わりに新しい制約の追加をアニメーションである:

self.myButton.addConstraint(newCenterConstraint) 

付:

がこの行を置き換える修正するには中心x拘束の定数を変更し、layoutIfNeeded関数をアニメートする。 (このためには、中央のxの制約のためにコンセントを接続する必要があると思います。)

それは次のようになります。

UIView.animate(withDuration: 0.5, delay: 0, options: UIViewAnimationOptions.curveEaseInOut, animations: { 
    self.centerConstraint.constant = 0 
    self.view.layoutIfNeeded() 
}, completion: nil) 
+0

これで完璧な意味があります。このためのシンプルなショートカットがありましたが、いずれもスマートな解決策のようには見えませんでした。本当にありがとう! –

0

私はちょうどそれをオフスクリーンでオフセットするために定数付きのcenterX制約を使用します。次に、定数を0に設定してアニメートします。

関連する問題