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
类型的IBOutlet
s(.h 或.m;没关系)。
将IBOutlet
s 连接到相应的NSLayoutConstraint
s。
在您的视图生命周期方法之一 (viewDidLoad
/viewWillAppear:
) 中,将约束设置为您想要的值。
听起来您主要是想防止该字段在 iPad 上跨越整个屏幕,因此您可以执行以下操作(假设 NSLayoutConstraint
s 被命名为“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 自动布局灵活宽度的主要内容,如果未能解决你的问题,请参考以下文章