プロジェクトをSwift 3にアップグレードしたため、自動レイアウト制約アニメーションは機能しません。具体的には、アニメーションではなく新しい位置にスナップしています。
UIView.animate(withDuration: 0.1,
delay: 0.1,
options: UIViewAnimationOptions.curveEaseIn,
animations: { () -> Void in
constraint.constant = ButtonAnimationValues.YPosition.DefaultOut()
self.layoutIfNeeded()
}, completion: { (finished) -> Void in
// ....
})
UIViewPropertyAnimator
クラスを追加したことは知っていますが、まだ試してはいません。
Swift 3.の最新のアップデートでもこの問題が発生しました。
正確には、ビューをアニメーション化するときはいつでも、実際にはそのビューのスーパービューでlayoutIfNeededを呼び出します。
代わりにこれを試してください:
UIView.animate(withDuration: 0.1,
delay: 0.1,
options: UIViewAnimationOptions.curveEaseIn,
animations: { () -> Void in
constraint.constant = ButtonAnimationValues.YPosition.DefaultOut()
self.superview?.layoutIfNeeded()
}, completion: { (finished) -> Void in
// ....
})
過去に、彼らはあなたがアニメーション化したいビューを再レイアウトできることに寛大だったようです。ただし、ドキュメントでは、スーパービューで実際にlayoutIfNeededを呼び出す必要があります。
Swift 3.0にアップグレード
Appleデフォルトのプッシュアニメーションのような右から左へのアニメーションを表示
//intially set x = SCREEN_WIDTH
view.frame = CGRect(x: ScreenSize.SCREEN_WIDTH, y: ScreenSize.SCREEN_HEIGHT - heightTabBar , width: ScreenSize.SCREEN_WIDTH, height: heightTabBar)
UIView.animate(withDuration: 0.50, delay: 0.0, usingSpringWithDamping: 1.0, initialSpringVelocity: 0, options: [], animations: {
//Set x position what ever you want
view.frame = CGRect(x: 0, y: ScreenSize.SCREEN_HEIGHT - heightTabBar , width: ScreenSize.SCREEN_WIDTH, height: heightTabBar)
}, completion: nil)
最初に制約の新しい値を設定してから、animateを呼び出します。
self.YOUR_CONSTRAINT.constant = NEW_VALUE
UIView.animate(withDuration: 1.0) {
self.view.layoutIfNeeded()
}
Swift 3.1、Xcode 8.3.2
このコードは私に適しています。ビューの変更はスローモーションでアニメーション化します。
UIView.animate(withDuration: 3.0, animations: { // 3.0 are the seconds
// Write your code here for e.g. Increasing any Subviews height.
self.view.layoutIfNeeded()
})
Swift 4、Xcode 10
検索用の右から左へのアニメーション
//最初にx = Your_View_Widthを設定します
viewOfSearch.frame = CGRect(x: viewOfSearch.frame.size.width, y: 0 , width: viewOfSearch.frame.size.width, height: 50)
UIView.animate(withDuration: 0.50, delay: 0.0, usingSpringWithDamping: 1.0, initialSpringVelocity: 0, options: [], animations: {
//Set x position what ever you want
self.viewOfSearch.frame = CGRect(x: 0, y: 0 , width: self.viewOfSearch.frame.size.width, height: 50)
}, completion: nil)
func setView(view: UIView) {
UIView.transition(with: view, duration: 1.0, options: .transitionFlipFromTop, animations: {
})
}