有必要转向 IOS AutoLayout 吗?

Necessary to Shift to IOS AutoLayout?

我有一个应用 运行,它使用旧的 iOS xib 弹簧设计方法和 struts。每个屏幕包含 iPhone 3.5 英寸和 iPhone 4 英寸的两个 xib 文件,所有程序化动画都略微通用,因此它们适用于两种分辨率。

自从推出 iPhone6 和 iPhone6 Plus 手机以来,这一切都有些失败,因此应用浏览量在这些设备上显得非常小。我使用了一种解决方法,通过删除 6 和 6 plus 分辨率的 'required' 图标文件来确保该应用程序在 6 和 6Plus 上扩展,该文件告诉 iOS 该应用程序支持本机分辨率在这些设备上。

我的问题是,当我尝试将所有视图切换为自动布局和大小 类(花了 4 天的时间苦苦挣扎)时,每次视图出现问题时。有些图像只在高度上按比例放大,有些紧靠一侧,有些滚动视图仅在一侧显示图像内部的图像等所以我恢复使用与 struts 和弹簧相同的技术。

  1. Do I really need to shift my views to Auto-layout? is there a way to avoid this or guidelines so that I may not need it?

  2. If there is no way out of it, How do people usually make animations in Auto-Layout views? All animations are translation animations, previously both devices had 320 width which made it easier, how do we now handle different resolutions and make generic translation animations?

  1. 没有人拿枪指着你的头来使用Autolayout。现在有很多可能的屏幕尺寸,所以 Autolayout 可以帮助您的界面适应不同的尺寸。不想用就别用

  2. 我不明白第二个问题,而且你用“解决”的方式很有趣。这与分辨率无关,与大小有关,简单明了。无论您是否使用自动布局,问题都是一样的。如果你想从屏幕的左边到屏幕的右边做动画,自然如果屏幕更宽,你就得走得更远。但是您知道屏幕的大小,所以没有问题。你只需做一些基本的算术运算。

    如果您使用的是自动版式,您甚至不需要算术;您使用 Autolayout 相对定位事物,它们可以在任何尺寸的屏幕上工作。这就是重点。

例如,这里的代码确实可以将视图从屏幕左侧移动到右侧,并且无论屏幕大小如何,它都能正常工作!

let c = self.leftConstraint.constant
NSLayoutConstraint.deactivateConstraints([self.leftConstraint])
let rightConstraint = NSLayoutConstraint(
    item: v, attribute: .Trailing, relatedBy: .Equal, toItem: self.view, 
    attribute: .TrailingMargin, multiplier: 1, constant: -c)
NSLayoutConstraint.activateConstraints([rightConstraint])
UIView.animateWithDuration(0.4, animations: {self.view.layoutIfNeeded()})
  1. 您可以通过为每个屏幕尺寸创建更多的 xib 文件,然后找出屏幕尺寸并加载正确的 xib 文件来摆脱它。但那样就更麻烦了!尤其是你必须在以后为 Apple 推出的每个新屏幕尺寸继续这样做。所以,使用 AutoLayout,阅读 THIS 教程,你就可以开始了!我还没有遇到不能使用 AutoLayout 的情况。很给力

  2. 您可以为约束设置动画!如果您从约束(那些蓝线)按住 Ctrl 并拖动到您的代码中,您可以持有指向 NSLayoutConstraint 对象的指针,然后只需更改 [UIView animate... 块中的 .constant 值.

您不必切换到 AutoLayout,但越早切换,从长远来看,事情就越容易。谁知道我们将来会看到什么新尺寸的屏幕。

您可以在使用 AutoLayout 时为视图设置动画,只是操作方式略有不同。您无需更改框架矩形,而是更改影响视图的约束。这可以通过更改现有约束的常量、更改优先级(注意您不能更改设置为 1000 的优先级)或通过 adding/removing 约束来完成。

动画化这些变化的步骤是:

1) 在父视图上调用 layoutIfNeeded 以确保一切都已在正确的位置。
2) 对约束、常量、优先级等进行所需的更改
3) 再次调用 layoutIfNeeded,这次是在 UIViewanimateWithDuration 方法中。