自动布局和动画

时间:2016-06-18 14:22:34

标签: ios objective-c uibutton autolayout uianimation

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

enter image description here

但我希望能够在self.letterA.translatesAutoresizingMaskIntoConstraints = YES; [UIView animateWithDuration:0.2 animations:^{ [letterA setFrame:CGRectMake(x, y, width, height)]; }]; 之间来回移动每个按钮,而不会弄乱整个自动布局设置。请参阅第二张图片以获取解释,我想做什么:

enter image description here

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

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时,此警告/错误/问题会持续多次打开和打开。现在该怎么办?

  1. 我可以忽略setFrame:吗?或者这会给你带来麻烦吗?
  2. 如果没有,如何解决?并且由于涉及到大量的约束,如何在不编辑每个约束条件的情况下修复它?
  3. 我非常希望使用 { "apiVersion": "2015-08-01", "name": "parameters('WebApp1')", "type": "Microsoft.Web/sites", ... "resources": [ { "apiVersion": "2015-08-01", "name": "web", "type": "config", "dependsOn": [ "[resourceId('Microsoft.Web/Sites', parameters('WebApp1'))]" ], "properties": { "virtualApplications": [ { "virtualPath": "/", "physicalPath": "site\\wwwroot" }, { "virtualPath": "/WebApp1", "physicalPath": "site\\wwwroot\\app1" }, ] } } }
  4. 保持动画效果

2 个答案:

答案 0 :(得分:2)

对你的观点:

  1. “我可以忽略无法同时满足约束警告” 没有。忽略这一点是一个非常糟糕的主意,即使UI或多或少出现了你想要的甚至是警告。这意味着系统正在决定如何渲染您的布局,因为您提供的指令是矛盾的。它分析了您提供的约束,并找到了通过分解其中一个或几个来创建一致布局的方法。无法保证它会决定在不同的屏幕尺寸或操作系统版本上打破相同的约束。忽略此警告会大大增加UI错误的可能性。

  2. 我想重新设计这个UI的方式。 IB / Storyboard Autolayout适用于高达一定复杂程度的UI。这个UI看起来略微超出了复杂程度 - 如果瓷砖不需要移动,那就没问题了。正如他们所做的那样,程序化自动布局可能会使事情变得更简单。 我采取的方法如下:

    一个。创建一个tile对象,它为顶部,左侧,宽度和高度约束公开NSLayoutConstraint属性。 (这些约束将添加到超级视图上,但也存储在磁贴本身上。)

    湾使用工厂对象方法设置视图,将新图块的起始位置偏移,宽度和高度作为参数。使用这些值可以独立设置每个切片的约束。不要将瓷砖相互约束 - 所有约束应该是内部(宽度,高度)或相对于超视图(x,y)。这意味着当您更改动画时,只会影响一个图块。实际上你有更多的约束,但它们在代码中,因此更容易管理。

    C)。使用UIView动画移动图块并使用图块上的约束调整它们的大小。您可以存储每个图块位置的初始帧,并使用这些值来确定目标约束值。您应该可以通过这种方式轻松调整切片的位置和大小。

    d)。 Apple NSLayoutConstraint的API有点冗长和丑陋。考虑使用更好的Autolayout DSL Masonry,以保持代码清洁。

  3. 只要您不使用Autolayout,您就可以继续使用-setFrame: - 两种方法只是不能很好地协同工作。如果您希望应用程序在多个屏幕大小上运行,则需要使用Autolayout,或者在代码中动态重新计算每个帧和偏移量。如果你不这样做(也许它是一个iPad应用程序,你不关心专业版,那么只需使用-setFrame:)。但是,总的来说,我建议咬紧牙关,只是学习Autolayout

答案 1 :(得分:1)

如果您使用自动布局,则应将translateAutoResizingMask设置为false,否则您将继续收到此错误。相反,您应该仅在动画块之前使用约束设置新位置,然后在动画块中调用layoutIfNeeded。在接口构建器中设置约束时,可以自动将translateAutoResizingMaskToConstraints设置为false。