使用约束为全屏 UIImageView 设置动画
Posted
技术标签:
【中文标题】使用约束为全屏 UIImageView 设置动画【英文标题】:Using constraints to animate full screen UIImageView 【发布时间】:2015-06-21 07:34:31 【问题描述】:在我的 iPhone(ios) 应用程序中,我使用全屏图像来显示有关屏幕上不同选项的“帮助”。我将前导、顶部、尾随和底部约束常量设置为“0”,指向超级视图。此方案在 iPhone 4S、5/5C/5S、6 和 6+ 上运行良好,没有任何问题。 现在点击图像视图,我必须为图像从右到左设置动画。在主视图上点击“帮助”按钮时,帮助图像将从左到右动画返回。我正在使用下面的动画代码:
self.helpViewLeadingConstraint.constant = 600;
[self.view layoutIfNeeded];
我面临的问题是,当动画正在进行时,我会看到一些警告。
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fdda85a4b70 UIView:0x7fddaa8f05a0.trailingMargin == UIView:0x7fdda85a3460.trailing - 16>",
"<NSLayoutConstraint:0x7fdda85a4c10 UIView:0x7fdda85a3460.leading == UIView:0x7fddaa8f05a0.leadingMargin + 600>",
"<NSLayoutConstraint:0x7fddabb09e30 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fddaa8f05a0(375)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fdda85a4b70 UIView:0x7fddaa8f05a0.trailingMargin == UIView:0x7fdda85a3460.trailing - 16>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
我找不到避免警告消息的解决方案。我们怎样才能同时设置两个满足的约束而不产生任何不成功的消息?
【问题讨论】:
您是在 xib 中还是以编程方式添加全屏图像? @ZaidPathan,我在“故事板”中添加了全屏图片 我认为您也错误地给出了宽度约束,因此可能无法满足前导尾随约束。 @ZaidPathan,不,我对图像视图只有 4 个约束 - 前导、尾随、顶部和底部。 【参考方案1】:您是否尝试过在设置常量之前调用 setNeedsUpdateConstraints? 这也可能有帮助https://github.com/SnapKit/SnapKit
【讨论】:
是的,警告信息没有变化。【参考方案2】:警告信息是正确的... 您必须同时更新前导约束和尾随约束。 Leading+600 和 Trailing-600 这将保留图像尺寸。并且不打破现有的约束。
在我的例子中,我有 2 张全屏图像,一张正在上升,一张正在下降。
这是相同的代码:
func animateOverlayImage()
let viewHeight = self.view.frame.height
UIView.animate(withDuration: Double(2.0), animations:
self.topImgTopConstraint.constant = -1 * viewHeight
self.topImgBottomConstraint.constant = viewHeight
self.bottomImgTopConstraint.constant = viewHeight
self.bottomImgBottomConstraint.constant = -1 * viewHeight
self.view.layoutIfNeeded()
)
【讨论】:
以上是关于使用约束为全屏 UIImageView 设置动画的主要内容,如果未能解决你的问题,请参考以下文章
在 iPad 上的上下文菜单中点击预览不会为全屏视图控制器的演示设置动画