IOS9以编程方式限制iphone和ipad

时间:2017-02-09 16:13:02

标签: swift uiviewcontroller constraints ios9

在视图控制器中,我以编程方式创建了uitextfield。对于这个textField我想有以下约束:从顶部90像素,高度50像素,从左右两侧8像素的iphone设备(所以宽度调整)和400像素固定宽度的情况下ipad设备。

以下是我的代码中指定了这些约束的部分:

-fno-realloc-lhs

此代码为iphone设备提供正确的结果,但对于ipad设备,它不是我想要的(调整文本字段的宽度)。据我所知,ipad的代码块不正确。

我的问题是如何以编程方式为iphone和ipad设备设置上述逻辑的约束?

我认为可能的解决方案可能是在设置约束之前检查屏幕大小宽度,但我不知道这是否适合此任务。

3 个答案:

答案 0 :(得分:4)

为了完成@ matt的最佳答案,下面是一个如何检查设备是iPad还是iPhone的示例。

enum UIUserInterfaceIdiom : Int {
    case unspecified

    case phone // iPhone
    case pad // iPad
}

然后您可以像这样使用它:

UIDevice.current.userInterfaceIdiom == .pad
UIDevice.current.userInterfaceIdiom == .phone
UIDevice.current.userInterfaceIdiom == .unspecified

或者如果您更喜欢使用Switch:

switch UIDevice.current.userInterfaceIdiom {
case .phone:
    // It's an iPhone
case .pad:
    // It's an iPad
case .unspecified:
    // Error handling
}

对于您的情况,您只需使用 if / else 语句。

您只需检查 IF 设备是iPad还是iPhone,然后相应地设置约束。

答案 1 :(得分:1)

  

iphone设备左右两侧8像素(宽度调整),ipad设备400像素固定宽度

首先,让我们注意到,对于iPad,您的约束条件没有明确规定,因为您没有说明视图的x原点应该在iPad上。所以,为了讨论的目的,我将不得不做一些事情:我会说你希望视图水平居中。

因此,在规定之后,您只需查看traitCollection并检查其userInterfaceIdiom即可。这会告诉您我们是在iPad还是iPhone(.pad.phone),而简单的if / else构造将允许您提供适当的约束集。

所以,如果没有我实际为你编写约束,这里是你将使用的结构:

text.topAnchor.constraint(equalTo: view.topAnchor, constant: 90).isActive = true
text.heightAnchor.constraint(equalToConstant: 50).isActive = true
let dev = self.traitCollection.userInterfaceIdiom
if dev == .phone {
    text.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8).isActive = true
    text.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8).isActive = true
} else {
    text.widthAnchor.constraint...
    text.centerXAnchor.constraint...
}

答案 2 :(得分:0)

尽管Apple建议尽可能使用前导跟踪,但使用leftAnchor和rightAnchor而不是前导/尾随可能会更加友好。