在我的程序中,我有 14 个不同的按钮,每个按钮都有一个字母。每个按钮都通过自动布局相互连接。所以有很多疯狂的限制。请参阅第一张图片以获取说明:
但我希望能够通过 UIAnimation
来回移动每个按钮不会弄乱整个自动布局设置。请参阅第二张图片以获取解释,我想要做什么:
现在我目前用来获取这些动画的代码:
self.letterA.translatesAutoresizingMaskIntoConstraints = YES;
[UIView animateWithDuration:0.2 animations:^{
[letterA setFrame:CGRectMake(x, y, width, height)];
}];
现在程序完美运行!绝对没有问题!但唯一的“问题”是此代码在控制台中生成此消息:
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)
而且这个警告/错误/问题会不断出现,不断出现,每一次都是
UIButton
被移动。现在我该怎么办?Unable to simultaneously satisfy constraints
?或者这会在路上造成麻烦吗? setFrame:
制作动画。 最佳答案
你的观点:
不,忽略这一点是一个非常糟糕的主意,即使 UI 或多或少地显示为您想要的,即使有警告也是如此。这意味着系统正在决定如何呈现您的布局,因为您提供的指令是矛盾的。它分析了您提供的约束,并找到了一种通过打破其中一个或多个约束来创建一致布局的方法。无法保证它会决定打破对不同屏幕尺寸或操作系统版本的相同限制。忽略此警告会大大增加 UI 错误的机会。
我将采取的方法如下。
一种。创建一个 tile 对象,它公开
NSLayoutConstraint
顶部、左侧、宽度和高度约束的属性。 (这些约束将添加到 super View 上,但也存储在图 block 本身上)。湾。使用工厂对象方法设置 View ,将新图 block 的起始位置偏移量、宽度和高度作为参数。使用这些值单独设置每个图 block 上的约束。根本不要将图 block 相互约束 - 所有约束都应该是内部的(宽度,高度)或相对于 super View (x,y)。这意味着当您为更改设置动画时,只有一个图 block 受到影响。您实际上有更多约束,但它们在代码中,因此更易于管理。
C)。使用
UIView
动画来移动瓷砖并使用瓷砖上的约束调整它们的大小。您可以存储每个平铺位置的初始帧,并使用这些值来确定目标约束值。您应该能够以这种方式轻松调整图 block 的位置和大小。d)。 Apple 用于
NSLayoutConstraint
的 API有点冗长和丑陋。考虑使用 Masonry ,一个更好的 Autolayout DSL,以保持你的代码干净。 -setFrame:
,只要您不使用 Autolayout - 这两种方法不能很好地配合使用。如果您希望您的应用程序在多个屏幕尺寸上运行,则需要使用 Autolayout,或者在代码中动态重新计算每一帧和偏移量。如果你不这样做(也许它是一个 iPad 应用程序并且你不关心 Pro,那么只需使用 -setFrame:
)。但是,总的来说,我建议硬着头皮学习 Autolayout 关于ios - 自动布局和动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37898000/