Xcode 6 自动布局灵活宽度

Posted

技术标签:

【中文标题】Xcode 6 自动布局灵活宽度【英文标题】:Xcode 6 auto layout flexible width 【发布时间】:2014-10-28 17:17:40 【问题描述】:

我有一个 UITextField,它使用 Xcode 6s 自动布局界面,我已将其宽度设置为 400 点。这在大屏幕设备上看起来不错,但在 iPhone 5s 上,这些框会从包含视图中消失。解决这个问题的正确方法是什么?

有没有办法设置一个约束,如果屏幕比这个大,UITextFields 宽度为 400 点,如果不是,则只填充容器视图,而不是溢出视图之外,或者我应该使用尺寸类将 UITextField 设置为与紧凑视图上的父视图具有相同的宽度。

【问题讨论】:

【参考方案1】:

不要在 UITextField 上设置宽度约束,而是在其左右添加水平空间约束。这样 UITextField 会随着屏幕自动调整大小。

【讨论】:

我唯一遇到的问题是对于像 iPad 这样的大屏幕设备,我不希望文本视图占据全屏,因为它看起来很傻。 苹果推荐的方法是为 iphone 和 ipad 使用不同的 storyboards/xibs。他们的代码将完全共享。 @KrisJurgowski 似乎 Apple 想要推动我们将 Storyboard 文件与每个大小类的不同实现相结合。我不确定我是否在乎这种工具/方法,但它似乎是未来的潮流。不过,我希望它们可以更轻松地区分设备/屏幕。现在,将 iPhone 与 iPad 区分开来相当容易,但将 iPhone 4S 与 iPhone 6 Plus 区分开来却令人困惑(至少在纵向模式下)。目前,我与您讨论单独的 Storyboard,但我认为支持的时间不会更长。 有效,谢谢,我想知道,为什么需要添加水平空间约束?我觉得左右约束就够了。【参考方案2】:

正如 Kris 所说,设置水平空间约束是解决此问题的好方法。

针对您关于不想要恒定“边距”的评论,您可以执行以下操作:

    在 Interface Builder 中设置水平空间约束。 在您的类中创建NSLayoutConstraint 类型的IBOutlets(.h 或.m;没关系)。 将IBOutlets 连接到相应的NSLayoutConstraints。 在您的视图生命周期方法之一 (viewDidLoad/viewWillAppear:) 中,将约束设置为您想要的值。

听起来您主要是想防止该字段在 iPad 上跨越整个屏幕,因此您可以执行以下操作(假设 NSLayoutConstraints 被命名为“textFieldLeft”,而 UITextField 被命名为“textFieldRight”@ “文本字段”):

- (void)viewDidLoad 
    if (UI_USER_INTERFACE_IDIOM == UIUserInterfaceIdiomPad) 
        self.textFieldLeft.constant = 50.0f;
        self.textFieldRight.constant = 50.0f;
        [self.textField layoutIfNeeded];
    

【讨论】:

以上是关于Xcode 6 自动布局灵活宽度的主要内容,如果未能解决你的问题,请参考以下文章

滚动视图不在自动布局 xcode 6.4 中滚动

我想将自动布局应用于 UILabel,例如灵活的高度和宽度

如何在 xcode 自动布局中使对象自动调整大小?

Xcode 6 - 另一个自动布局视图中的自动布局视图

自动首选最大布局宽度在 8.0 之前的 iOS 版本中不可用

约束/自动布局栏隐藏,Xcode 6