ios - 自动布局和动画

标签 ios objective-c uibutton autolayout uianimation

在我的程序中,我有 14 个不同的按钮,每个按钮都有一个字母。每个按钮都通过自动布局相互连接。所以有很多疯狂的限制。请参阅第一张图片以获取说明:

enter image description here

但我希望能够通过 UIAnimation 来回移动每个按钮不会弄乱整个自动布局设置。请参阅第二张图片以获取解释,我想要做什么:

enter image description here

现在我目前用来获取这些动画的代码:

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 错误的机会。
  • 我会重新考虑这个 UI 的整个设计方式。 IB/Storyboard Autolayout 适用于具有一定复杂性的 UI。这个 UI 看起来稍微超出了这个复杂程度——如果图 block 不需要移动,那就没问题了。正如他们所做的那样,程序化自动布局可能会使事情变得更简单。
    我将采取的方法如下。

    一种。创建一个 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/

    相关文章:

    ios - indexedDB 在 iOS 上表现不佳?

    ios - 如何检查相机是否打开以捕获图像或在 iOS 中录制视频?

    iphone - 制作 UIButton 复选框的最佳方法是什么?

    ios - 5X5 UIButton选择逻辑

    ios - 在封闭路径上绘制 CGGradient

    iphone - 将带有动画的矢量图形嵌入到 iOS 原生应用程序中

    iOS - 尝试在 NSUserDefaults 中插入非属性列表对象 NSDictionary

    ios - UIPopoverPresentationController 在 iPhone 上显示全屏模式

    iphone - 以编程方式设置 UIButton 的 buttonType

    ios - UITableView 的 textLabel.text 位置在 iOS 中不居中