IOS6 使用自动布局的约束

Posted

技术标签:

【中文标题】IOS6 使用自动布局的约束【英文标题】:IOS6 Constraints using Autolayout 【发布时间】:2013-05-24 19:11:24 【问题描述】:

我有一个可以旋转的应用程序,所以我需要处理纵向和横向方向。此外,用户将被允许使用捏合手势来改变视图的比例。这是视图的基本层次结构。

mainView 是 self.view 的子视图(来自主视图控制器的上下文)。它是一个 UIImageView,虽然它的图像部分相对不重要。无论如何,这是本次讨论中的其余视图作为子视图放置在其中的视图。

第一个是我所说的董事会。它是用户组装哪些项目的视图。这些项目本身就是图像视图。

此外,还有我所说的调色板。这些只是可以由用户调整大小和缩放的视图。此外,刚刚提到的图像视图可以从一个调色板拖到另一个调色板或板上。调色板可以被认为是用户的工作空间。完成工作后,他们将组件放在板上。

到目前为止,我一直在使用该应用程序,其中板是自动布局的一部分,但调色板是根据需要以编程方式创建的。这很好,因为当用户旋转设备时,自动布局会自动适当地放置电路板。至少在我想为其添加捏缩放之前它确实如此。

自动布局在界面生成器中设置了以下约束: 前导、顶部、尾随和底部都设置为超级视图默认值。

当用户缩放视图时,结果是它有点粘在屏幕的左上角。我宁愿让它保留中心。

我尝试通过将以下代码添加到此视图的捏合手势识别器来以编程方式更改此设置:

  if (self.pinchView.tag == TAGBOARD) 
     [NSLayoutConstraint constraintWithItem:self.pinchView
                                  attribute:NSLayoutAttributeCenterX
                                  relatedBy:NSLayoutRelationEqual
                                     toItem:self.mainView
                                  attribute:NSLayoutAttributeCenterX
                                 multiplier:1.0
                                   constant:0];
  

但这似乎无济于事。我猜这是因为它与 IB 约束冲突。我还能做些什么来使用自动布局来完成这项工作吗?还是应该像处理其他视图一样以编程方式完成所有操作?

在此代码示例中,self.pinchView 是应用了捏合手势的视图。为便于讨论,我将其称为董事会。 self.mainView 视图是它的父视图。

【问题讨论】:

我在想我想要做的事情在约束条件下是不可能的,因为确定大小所需的部分内容来自用户捏合手势。自动布局中的约束必须完全指定大小和位置。除非有办法从捏合手势数据中传递部分数据,否则我认为我做不到。 查看您的代码 sn-p 我猜您忘记将此约束添加到您的视图中。我说的对吗? 我没有忘记。在出现捏合手势之前,它是不相关的。基本上,其他四个约束作为默认约束,然后我希望这个新手势能够取代它们,如果可能的话。以编程方式管理视图是一项繁重的工作,因为我有手势识别器和其他未附加的东西。 @Robert,如何在 IB 中添加这样的约束?我没有看到任何菜单项来添加约束。我觉得我在那里遗漏了一些基本的东西,但是查看参考资料并没有结果。 【参考方案1】:

我们在代码中没有看到的部分类似于

[self.pinchView addConstraint:yourNewConstraint]; 

我可以看到您创建约束的位置,但无法将其添加到视图中。如果您希望您的约束获胜,您需要删除其他视图或确保新约束具有更高的优先级。

如果您的视图应该居中,请尝试调整情节提要中的约束以将宽度和高度固定为默认值,然后在中心水平对齐。这应该满足自动布局并复制您要添加的内容,然后在您的捏识别器中,您可以更改宽度和高度的常数。请务必将您的宽度和高度约束拖到控制器中以创建一个出口,以便您可以在捏合手势期间调整它们。

【讨论】:

我已经选择了一个替代方案,但我相信你已经成功了。我什至没有保存创建的对象。我认为它是使用该方法调用应用于指定视图的。 我编辑了您的答案以反映我在阅读您的版本后的新理解。如有不妥请指正。 我尝试了这个添加并得到一个错误:***由于未捕获的异常'NSGenericException'而终止应用程序,原因:'无法在视图上安装约束。约束是否引用了视图子树之外的内容?那是违法的。约束:<0x1f863820 puzuiview:0x1f845cf0.centerx="=" uiimageview:0x1f845b00.centerx><0x1f845cf0 tm>

以上是关于IOS6 使用自动布局的约束的主要内容,如果未能解决你的问题,请参考以下文章

ios 6自动布局约束错误

ios 6:使用自动布局约束垂直居中 UILabel

自动布局 iOS7 -> 带状态栏的 iOS6

具有动态视图数量和自动布局 iOS6 的 UIScrollView

如何管理适用于 iOS 7 和 iOS 6.0 的自动布局约束

如何在启用自动布局的情况下更改 iOS6 中的 UIView 大小?