我有一个UITextField
,我想扩大其宽度时,点击。我设置了约束,并确保左侧的约束具有较低的优先级,然后我试图在右侧设置动画。
下面是我尝试使用的代码。
// move the input box
UIView.animateWithDuration(10.5, animations: {
self.nameInputConstraint.constant = 8
}, completion: {
(value: Bool) in
println(">>> move const")
})
这是有效的,但它似乎只是立即发生,似乎没有任何运动。我试着把它设置为10秒,以确保我没有错过任何东西,但我得到了同样的结果。nameInputConstraint
是一个约束的名称,我控制它从IB拖到我的类中。
7条答案
按热度按时间sr4lhrrt1#
需要先更改约束,然后设置更新的动画。
这个应该在监控室里
Swift 2
Swift 3,4,5
vqlkdk9b2#
SWIFT 4及以上版本:
完成示例:
lztngnrs3#
需要指出的是,
view.layoutIfNeeded()
只适用于视图子视图。因此,要设置视图约束的动画,必须在view-to-animatesuperview上调用它,如下所示:
简单布局的示例如下所示:
6vl6ewon4#
使用Swift 5和iOS 12.3,根据您的需求,您可以选择以下3种方式之一来解决您的问题。
#1.使用
UIView
的animate(withDuration:animations:)
类方法animate(withDuration:animations:)
有以下声明:使用指定的持续时间对一个或多个视图的更改制作动画。
下面的Playground代码显示了
animate(withDuration:animations:)
的一个可能实现,以便为自动布局约束的不断更改设置动画。#2.使用
UIViewPropertyAnimator
的init(duration:curve:animations:)
初始化器和startAnimation()
方法init(duration:curve:animations:)
有以下声明:使用内置的UIKit计时曲线初始化动画制作器。
下面的Playground代码显示了
init(duration:curve:animations:)
和startAnimation()
的可能实现,以便为自动布局约束的不断更改设置动画。#3.使用
UIViewPropertyAnimator
的runningPropertyAnimator(withDuration:delay:options:animations:completion:)
类方法runningPropertyAnimator(withDuration:delay:options:animations:completion:)
有以下声明:创建并返回立即开始运行其动画的animator对象。
下面的Playground代码显示了
runningPropertyAnimator(withDuration:delay:options:animations:completion:)
的一个可能实现,以便为自动布局约束的不断更改设置动画。rggaifut5#
在我的例子中,我只更新了自定义视图。
oipij1gg6#
我想分享我的解决方案,在我不工作的情况下,我的约束设计如下
每当我试图在动画之前设置常量时
它立即设置,所以它没有为我工作。
我将约束属性的定义更改为
那我就成功了
5ktev3wc7#
观看this。
视频中说,你只需要像下面这样添加
self.view.layoutIfNeeded()
: