【问题标题】:Working with AutoLayout in Portrait and Landscape在纵向和横向中使用自动布局
【发布时间】:2013-08-15 07:43:45
【问题描述】:

自动布局,尽管它很好,但让我为约束而发疯。我在 IB 中设计了纵向模式,但无法获得所需的横向模式。

请注意,当方向更改为横向时,UIImageView 块之间的间距会减小,SAMPLE TEXT 的文本对齐方式会更改为右对齐。

目前,我为它添加了一些约束条件。但是,我需要保持 UIImageView 块之间的空间是固定的,因此它在纵向上看起来很拥挤,而在横向上看起来很好。我需要它在纵向上均匀分布并在横向上压缩(如上图所示)。同样,目前我的约束会显示文本,但不会将其保持在屏幕中心并右对齐。

自动布局可以实现吗?如果是这样,怎么做?非常感谢您的帮助。

【问题讨论】:

标签: ios objective-c xcode autolayout


【解决方案1】:

有几种方法可以解决这个问题。一种方法是将您的 3 个图像视图包含在 UIView 中。分别将顶部和底部图像视图约束赋予顶部和底部,并赋予中间一个 centerY 约束。给这个封闭的视图一个固定的高度和宽度,以及对控制器视图顶部的约束。为这个封闭视图创建一个高度约束的 IBOutlet,并在旋转时更改它。在下面的示例中,我给它的纵向高度为 350:

-(void)updateViewConstraints {
    [super updateViewConstraints];
    if (self.view.bounds.size.height < self.view.bounds.size.width) {
        self.heightCon.constant = self.view.bounds.size.height;
    }else{
        self.heightCon.constant = 350;
    }
}

至于标签,最简单的方法是移除你的约束(bottom 和 centerX),并在旋转时添加 trailing 和 centerY。

【讨论】:

  • 听起来不错。但是,我的视图没有响应 -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 持续时间:(NSTimeInterval)duration..我尝试 NSLog-ging interfaceOrientation 但没有任何输出..所以我已经注册了方向通知设备,但这会使动画变得迟缓..你知道为什么视图没有响应你提到的方法
  • @GauravWadhwani,我不知道为什么不调用它。我更改了我的帖子以将代码放在 updateConstraints 中。看看这是否有效。
  • 那行得通,非常感谢!!!在这上面花了一整天。稍后将添加块并标记您的答案。再次感谢:)
  • 我们不能通过避免编写上述代码来使用 Xibs 来做到这一点吗?
  • @NagaMalleshMaddali,是的,您可以使用 xib(以及在它们之间切换的代码)来执行此操作,但问题特别询问是否可以使用自动布局来完成。
【解决方案2】:

是的,可以使用自动布局来完成。如果您希望视图之间的间距根据方向增加和/或减少,您可以使用小于或等于或大于或等于关系(而不是等于)作为约束,这允许距离增加或缩小:

玩弄它,你应该能够得到你想要的。

【讨论】:

  • 感谢您的回复。我尝试改变那个约束。但是,一旦我将其更改为“等于”以外的任何内容,它就会给我水平定位的模棱两可的布局警告。
  • 您需要将其他约束添加到顶部和底部 UIImageView 以便在它们之间的约束中使用 = 不会有歧义。
  • 我需要 UIImage 的位置在垂直方向上是可变的,所以无论我添加什么约束,它都是 的形式。但是 xcode 希望我为固定的垂直添加至少一个约束。如何添加固定约束并保持灵活性?
  • 这很棘手。您必须进行试验,包括约束优先级。但是,如果您尝试像 Xcode 一样思考并说“鉴于这里的约束,我可以明确地定位这个视图吗?”这会有所帮助。这就像解决一个逻辑难题,一开始并不总是那么容易。
【解决方案3】:

是的,使用自动布局绝对可以做到这一点。通过一系列我认为可能太长而无法作为答案发布的步骤,您可以保留 ImageView 之间的间距并保持文本的对齐方式相同。

基本上,您必须固定每个 ImageView 的一个角并移除一些约束,以便在您更改方向时它不会自动压缩间距。

有关如何执行此操作的完整说明(几乎正是您所要求的)is explained in this tuorial。你可以在页面的一半左右找到它。

希望这就是您想要的。

【讨论】:

  • 嘿,目前压缩和文本对齐方式没有改变。我想要压缩空间和改变文本对齐方式..
  • 你试过我给的链接了吗?您要压缩哪个空间?从您的问题看来,您不希望它们横向压缩。你真的想要压缩它们吗?
  • 是的,我希望块在纵向中间隔开并在横向中压缩,以便它们适合图像中显示的方式。我之前尝试了该链接,但无法解决问题。不过会再读一遍:)
猜你喜欢
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多