IOS9 以编程方式限制 iphone 和 ipad

Posted

技术标签:

【中文标题】IOS9 以编程方式限制 iphone 和 ipad【英文标题】:IOS9 programmatically constraints for iphone and ipad 【发布时间】:2017-02-09 16:13:02 【问题描述】:

在视图控制器中,我以编程方式创建了 uitextfield。对于此文本字段,我希望有以下限制:距顶部 90 像素,高度 50 像素,iphone 设备的左右两侧各 8 像素(因此调整宽度)和 ipad 设备的 400 像素固定宽度。

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

text.topAnchor.constraint(equalTo: view.topAnchor, constant: 90).isActive = true
text.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8).isActive = true
text.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8).isActive = true
text.heightAnchor.constraint(equalToConstant: 50).isActive = true

此代码为 iphone 设备提供了正确的结果,但是对于 ipad 设备,这不是我想要的(调整了文本字段的宽度)。我了解该代码块不适用于 ipad。

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

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

【问题讨论】:

【参考方案1】:

为了完成@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 语句。

您只需检查如果设备是 iPad 还是 iPhone,然后相应地设置您的约束条件。

【讨论】:

【参考方案2】:

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...

【讨论】:

【参考方案3】:

使用 leftAnchor 和 rightAnchor 代替前导/尾随可能在设备间更友好,尽管 Apple 建议尽可能使用前导尾随。

【讨论】:

以上是关于IOS9 以编程方式限制 iphone 和 ipad的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 iPhone 联系人导出到 .vcf 文件

企业 IPA 文件(内部)的最大限制?

iOS9:在另一个以编程方式添加的视图中居中以编程方式添加的视图

以编程方式在iPhone 6中使用指导访问

为 iOS 9 重新签署 IPA

是否可以以编程方式强制 iOS 应用程序在拆分视图/滑动中在 ios9 中全屏显示?