36

我知道我错过了一些东西,因为这必须是容易实现的。

我的问题是我的“加载屏幕”(即在启动后立即出现的那个)中有一个 UIImageView,其中包含两个不同的图像,分别用于 3.5 英寸和 4 英寸大小的屏幕。在该图像的某个位置,我放置了一个 UIActivityIndi​​cator,以告诉用户应用程序正在后台加载某些内容。两个图像的那个位置不一样,因为其中一个明显高于另一个,所以我想设置一个自动布局约束,允许我将活动指示器放在不同的高度,这取决于应用程序是否在iPhone 5 与否。

如果没有自动布局,我会将视图的 frame.origin.y 设置为 300(例如),然后在 ViewController 的 viewDidLoad 方法中,我会询问应用程序是否在 iPhone 5 中运行,所以我d 将值更改为例如 350。我不知道如何使用 Autolayout 执行此操作,我认为它必须非常简单。

4

5 回答 5

109

您可以在视图控制器上创建一个NSLayoutConstraint插座,并将该插座连接到您的 xib 或情节提要中活动指示器的 Y 约束。然后,将一个updateViewContraints方法添加到您的视图控制器并根据屏幕大小更新约束的常量。

将约束连接到出口

这是一个例子updateViewConstraints

- (void)updateViewConstraints {
    [super updateViewConstraints];
    self.activityIndicatorYConstraint.constant =
        [UIScreen mainScreen].bounds.size.height > 480.0f ? 200 : 100;
}

当然,您需要输入适当的值而不是200and 100。您可能想要定义一些命名常量。另外,别忘了打电话[super updateViewConstraints]

于 2013-04-01T21:52:54.637 回答
17

@Rob 的问题是你应该为每个约束做很多代码。所以要解决这个问题,只需ConstraintLayout在代码中添加类并修改 IB 中所需设备的约束常量值:

在此处输入图像描述

//
//  LayoutConstraint.swift
//  MyConstraintLayout
//
//  Created by Hamza Ghazouani on 19/05/2016.
//  Copyright © 2016 Hamza Ghazouani. All rights reserved.
//

import UIKit

@IBDesignable
class LayoutConstraint: NSLayoutConstraint {

    @IBInspectable
    var 3¨5_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 480 {
                constant = 3¨5_insh
            }
        }
    }

    @IBInspectable
    var 4¨0_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 568 {
                constant = 4¨0_insh
            }
        }
    }

    @IBInspectable
    var 4¨7_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 667 {
                constant = 4¨7_insh
            }
        }
    }

    @IBInspectable
    var 5¨5_insh: CGFloat = 0 {
        didSet {
            if UIScreen.main.bounds.maxY == 736 {
                constant = 5¨5_insh
            }
        }
    }
}

不要忘记继承你的类约束,ConstraintLayout 我将很快添加objective-c版本

于 2016-05-19T14:06:12.367 回答
1

自动布局中管理 UI 对象位置的基本工具是约束。约束描述了两个视图之间的几何关系。例如,您可能有一个约束:“进度条的右边缘连接到标签的左边缘,它们之间有 40 个空白点。”</p>

这意味着使用 AutoLayout 您不能根据 UIDevice 的模式进行有条件的位置设置,而是可以创建一个视图布局来修改自身,例如。该应用程序根据约束在 3.5' 全屏 (IPhone4) 或 4' 全屏 (IPhone5) 上运行。

因此,使用约束解决您的问题的选项:

1)在您的布局上找到一个视图,该视图可用于创建约束以相对定位进度条。(使用 CMD 按钮选择视图和进度条,然后使用 Editor/Pin/Vertical Spacing 菜单项在 2 个对象之间创建垂直约束)

2)创建一个绝对约束以将进度条的位置粘贴到屏幕边缘(保持空间)或居中

我发现这个关于 AutoLayout 的教程很有帮助,它也可能对你有益: http ://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2

请注意:自动布局仅适用于 IOS 6。

于 2013-04-01T21:30:18.210 回答
0

我通常总是尝试留在 Interface Builder 中设置约束。例如,如果您在 iPhone 4 和 6 上具有完全不同的布局,那么深入研究代码以获得更多控制通常很有用。

如前所述,您不能在 Interface Builder 中使用条件,这时将约束链接到您的视图控制器真的很方便。

以下是针对不同屏幕尺寸解决自动布局问题的 3 种方法的简短说明:http: //candycode.io/how-to-set-up-different-auto-layout-constraints-for-different-screen-sizes/

于 2015-05-10T10:40:33.967 回答
0

新方式,不写一行!

无需编写基于设备的条件,例如:-

if device == iPhoneSE { 
   constant = 44 
} else if device == iPhone6 {
   constant = 52
}

我创建了一个库Layout Helper,因此现在您无需编写任何代码即可更新每个设备的约束。

在此处输入图像描述

第1步

将 NSLayoutHelper 分配给您的约束

在此处输入图像描述

第2步

更新所需设备的约束

在此处输入图像描述

第 3 步

运行应用程序并查看 MAGIC

在此处输入图像描述

于 2019-09-17T10:51:44.997 回答