在 iOS 6 中启用自动布局,在 < iOS6 中禁用自动布局

Posted

技术标签:

【中文标题】在 iOS 6 中启用自动布局,在 < iOS6 中禁用自动布局【英文标题】:Enable Autolayout in iOS 6, Disable Autolayout in < iOS6 【发布时间】:2013-01-17 03:52:02 【问题描述】:

如果我的项目支持 ios 4.3 及更高版本,我如何在 iOS6 only 中启用自动布局,但在较低版本中禁用它?

【问题讨论】:

顺便说一句,鉴于非自动布局尚未被弃用(即,它仍然受支持),您总是可以考虑完全关闭自动布局并称之为一天。只需提供一个非自动布局的应用程序。或者您是否计划通过自动布局为 iOS 6 用户启用某些功能,而不是向 iOS 5 用户提供?但是,如果您为使该应用程序适用于 iOS 5 做了大量工作,我不确定您为什么还要做一个自动布局版本。 【参考方案1】:

如果您使用情节提要,请创建两个情节提要,一个开启自动布局,另一个关闭自动布局。然后一种检查方法是根据操作系统版本加载任何一个。

我用了这个小宏

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:(v) options:NSNumericSearch] != NSOrderedAscending)

这也应该有效(在某些情况下可能比上面更好):

if ([NSLayoutConstraint class]) 
    //   >= 6.0
 else 
    //   < 6.0

然后在我的 appDelegate 中:

UIStoryboard *mainStoryboard = nil;

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) 

     mainStoryboard = [UIStoryboard storyboardWithName:@"AutoLayoutStoryboard" bundle:nil];
 
else 

     mainStoryboard = [UIStoryboard storyboardWithName:@"NoAutoLayoutStoryboard" bundle:nil];


//load initial view controller
UIViewController *rootView = [mainStoryboard instantiateInitialViewController];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = rootView;
[self.window makeKeyAndVisible];

添加:如果您正在使用 nib,并且只想为 iOS6 启用自动布局,您可以创建一个启用自动布局的故事板(或 nib),并使用上述版本检查加载它们

【讨论】:

你如何设置'mainStoryboard'?在 App Delegate 中设置 storyboard 的代码是什么?【参考方案2】:

您应该使用两个 xib 文件,或者在编写自动布局和约束代码之前以编程方式对其进行检查。

【讨论】:

如何以编程方式检查它?顺便说一句,我一直在使用 xib 文件。 :) 有多种方式:从 UIDevice 类,你可以有版本字符串。通过检查 respondsToSelector,您可以检查特定属性的可用性。

以上是关于在 iOS 6 中启用自动布局,在 < iOS6 中禁用自动布局的主要内容,如果未能解决你的问题,请参考以下文章

iOS 6 - 从自动布局中免除 ViewController

如何在启用自动布局的情况下更改 iOS6 中的 UIView 大小?

如何通过启用自动布局功能的代码插入 UIButton - iOS

启用自动布局的 iOS 调整视图大小

在 iOS 6 上使用自动布局在 ScrollView 中嵌入 ImageView

XCode 6.0.1 ios 7 自动布局