我有一个UIView,我通过编程方式将其添加到我的UIViewController中,就像这样:
if let myView = Bundle.main.loadNibNamed("MyView", owner: self, options: nil)?.first as? MyView
{
self.view.addSubview(myView)
myView.translatesAutoresizingMaskIntoConstraints = false
//Horizontal orientation
self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-10-[view]-10-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":myView]))
}
没问题,视图已经在视图控制器的(0,0)位置添加了所需的左右空间。
我想实现的是视图从视图控制器底部动画进入到中心,然后再从中心动画退出到顶部。
首先,我尝试将视图从当前位置(0,0)动画到中心。
所以我做的是:
UIView.animate(withDuration: 1.0,
animations:
{
let center = NSLayoutConstraint(item: myView, attribute: .centerY, relatedBy: .equal, toItem: self.view, attribute: .centerY, multiplier: 1, constant: CGFloat(0.0))
self.view.addConstraint(center)
})
视图位于中心,但没有动画效果,它直接跳转到该位置。
我搜索并找到了很多答案,说我必须设置约束的常量,然后调用layoutIfNeeded()
,但所有这些示例都使用引用之前设置的约束作为IBOutlet,而我是通过编程方式添加我的视图。
如何正确地对视图进行动画处理,从底部到中心,然后从中心到顶部?
非常感谢!
问候
编辑1
好吧,我再进一步解释一下我想要实现什么。 在我的视图控制器上,在向用户显示5秒计时器后,我想逐个显示几个问题。
我希望一个问题从底部滑入中心,被回答后再从中心滑出到顶部。然后下一个问题从底部滑入中心,被回答后滑出等等。
因此,在5秒计时器之后,我调用名为slideInQuestion的方法创建一个问题并将其动画化:
func slideInQuestion()
{
let question:QuestionView = createQuestion()
UIView.animate(withDuration: 1.0,
animations:
{
self.yConstraint?.constant = CGFloat(0.0)
self.view.layoutIfNeeded()
})
createQuestion方法实例化问题视图并为其分配约束条件
func createQuestion() -> QuestionView
{
if let questionView = Bundle.main.loadNibNamed("QuestionView", owner: self, options: nil)?.first as? QuestionView
{
self.view.addSubview(questionView)
questionView.translatesAutoresizingMaskIntoConstraints = false
//Horizontal orientation
self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-10-[view]-10-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":questionView]))
yConstraint = NSLayoutConstraint(item: questionView,
attribute: .centerY,
relatedBy: .equal,
toItem: self.view,
attribute: .centerY,
multiplier: 1,
constant: CGFloat(UIScreen.main.bounds.height))
self.view.addConstraint(yConstraint!)
return questionView
}
return QuestionView()
}
之前,我按照 Duncan C 的建议将 yConstraint 定义为实例变量:
var yConstraint:NSLayoutConstraint?
我期望的结果是:
问题视图已创建,其中心位于视图控制器的中心+屏幕高度。这使得它在屏幕底部超出可见视图。然后它在1秒内从此位置滑动到屏幕中心点(0.0)。
但现在的情况是,它从屏幕顶部滑动到屏幕中心,并同时按照第一个约束设置的左右边距进行调整大小。
self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-10-[view]-10-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":questionView]))
我现在完全困惑了,希望我的解释有助于理解并能给出一些想法。
谢谢!
layoutIfNeeded
。 - Connor Neville