在视图控制器中,我以编程方式创建了uitextfield。对于这个textField我想有以下约束:从顶部90像素,高度50像素,从左右两侧8像素的iphone设备(所以宽度调整)和400像素固定宽度的情况下ipad设备。
以下是我的代码中指定了这些约束的部分:
-fno-realloc-lhs
此代码为iphone设备提供正确的结果,但对于ipad设备,它不是我想要的(调整文本字段的宽度)。据我所知,ipad的代码块不正确。
我的问题是如何以编程方式为iphone和ipad设备设置上述逻辑的约束?
我认为可能的解决方案可能是在设置约束之前检查屏幕大小宽度,但我不知道这是否适合此任务。
答案 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而不是前导/尾随可能会更加友好。