我正在以编程方式创建UIView,之后我将使用约束从下到上设置该视图的动画。但动画不会显示在此视图对象上。
overlay!.addSubview(contentView)
contentView.translatesAutoresizingMaskIntoConstraints = false
contentView.leadingAnchor.constraint(equalTo: vc.view.leadingAnchor, constant: 20).isActive = true
contentView.trailingAnchor.constraint(equalTo: vc.view.trailingAnchor, constant: -20).isActive = true
contentView.addSubview(messageLabel)
messageLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 8).isActive = true
messageLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -8).isActive = true
messageLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 8).isActive = true
messageLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -8).isActive = true
let width: CGFloat = vc.view.frame.width - 40 - 16
stringHeight = calculateEstimatedHeight(width: width, text: text) + 16
contentView.heightAnchor.constraint(equalToConstant: stringHeight).isActive = true
bottomConstraint = contentView.bottomAnchor.constraint(equalTo: vc.view.bottomAnchor, constant: stringHeight)
bottomConstraint.isActive = true
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
self.showToastViewWithAnimation(viewController: vc)
}
@objc func showToastViewWithAnimation(viewController: Any) {
if let vc = viewController as? ViewController {
vc.view.layoutIfNeeded()
UIView.animate(withDuration: 0.8) {
self.bottomConstraint.constant = -20
vc.view.layoutIfNeeded()
}
}
}
在代码中添加此行:
self.translatesAutoresizingMaskIntoConstraints = false
contentView.translatesAutoresizingMaskIntoConstraints = false
在你的ShowToastView函数中,首先找到哪个是底部约束,然后尝试这样更新它(记住它是一个提示代码,你可以根据你的要求更新它):
@objc func showToastViewWithAnimation(viewController: Any) {
if let vc = viewController as? ViewController {
if let bottom = self.contentView.superview?.constraints.first(where: { (constraint) -> Bool in
return constraint.firstAttribute == .bottom}){
// in this condition find your bottom constraint and update it, don't save your constraint in a variable.
bottom.constant = -20
UIView.animate(withDuration: 0.8, animations: {
vc.view.layoutIfNeeded()
}) { (complete) in
}
}
}
}
我通过评论指出了一些事情,阅读评论,您将了解代码中的问题,请查看下面的代码。
=
@objc func showToastViewWithAnimation(viewController: Any) {
if let vc = viewController as? ViewController {
//vc.view.layoutIfNeeded() - this is not required before updating constraint value
self.bottomConstraint.constant = -20 //update contstraint outside of the animation block
UIView.animate(withDuration: 0.8) {
//vc.view.layoutIfNeeded()
self.overlay?.layoutIfNeeded() //you needs to layout the overlay view, as your other toast views are added in overlay view and not in view of viewcontroller as per your code
}
}
}
我正在用更新一个旧的应用程序,当没有广告时,它就会滑出屏幕。当有广告时,它会在屏幕上滑动。基本的东西。 老风格,我设置了一个动画块的框架。新样式中,我有一个到auto-layout约束,它确定位置,在本例中是距离超级视图底部的距离,并修改常数: 和预期的一样,但没有动画。 更新:我重新观看了WWDC12讨论的最佳实践,以掌握自动布局,其中包括动画。它讨论了如何使用CoreAnimation更新约束
我花了两天时间尝试了混合和纯自动布局方法的各种解决方案,以实现在自动布局之前简单的滚动视图设置,现在它是正式的了——我一定太傻了。我主要是在故事板中设置这个(嗯,就是这样)。 所以我请求帮助。 视图树: 按钮应该水平滚动(从左到右,反之亦然)。有人能告诉我如何设置约束来使用纯自动布局实现这一点吗??? -- 我尝试了混合方法,如下所示: ...以及根据Apple的TechNote为< code>c
在我的应用程序中,我正在为视图的高度约束设置动画,当高度约束更改时,视图会向下平移一段时间,尽管我将约束设置为0。下面是我用来设置更改动画的代码: 下面是创建所有可扩展视图的方法: 对我来说,问题不在于如何设置高度变化的动画,因为这是可行的,而在于解决一个事实,即在一段时间内,应用程序似乎忽略了顶部的约束。这是显示动画的gif
虽然有几个问题的答案与我的相似,但似乎没有一个能解决我的困境。我有一个图像视图,我可以通过改变水平和垂直约束来移动它,并使用长按手势在屏幕上移动。如果这张图像没有移动一定的距离,我希望它能动画化回到原来的位置。我正在使用以下代码示例来尝试执行此操作: 和在其他地方定义为用户单击的位置 和定义为用户在超级视图中的位置 不用说,平移图像时,一切都正常。它会拖动,然后在手势结束时停止。问题是,如果用户没
问题内容: 我正在使用来更新旧的应用,并且当没有广告时,它会滑出屏幕。出现广告时,它会在屏幕上滑动。基本的东西。 旧样式,我将帧设置在动画块中。新样式,我对自动布局约束有一个确定Y位置,在这种情况下,它是距父视图底部的距离,并修改常量: 横幅完全按预期移动,但没有动画。 更新:我重新观看了WWDC 12讲的“掌握自动布局的最佳实践” ,其中涵盖了动画。它讨论了如何使用CoreAnimation更新
我设置了一个动画,以在打开另一个开关/标签时隐藏一个开关/标签。同时,刚刚打开的开关向上移动。这里的简单解释非常有效。 但是,当我在开关/标签关闭后尝试向下移动时,它不会移动。另一个开关会很好地重新出现,但不会触发顶部约束更改。 我对这种类型的设置和动画都是以编程方式进行的相对较新,在花了一个小时之后,我被难住了。是因为我正在制作相对于另一个顶部约束的动画吗?如果它第一次工作,这有什么关系?即使隐