为了账号安全,请及时绑定邮箱和手机立即绑定

在保持与iOS 5向下兼容的同时,在iOS 6中启用自动布局

在保持与iOS 5向下兼容的同时,在iOS 6中启用自动布局

iOS
大话西游666 2019-10-24 10:40:54
在利用iOS 6的新自动布局功能同时仍能与早期版本的iOS上的旧设备兼容的最佳方式是什么?
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

可以在每个.storyboard或.xib文件上启用或禁用自动布局。只需选择特定文件,然后使用Xcode中的文件检查器修改“使用自动布局”属性即可:

//img1.sycdn.imooc.com//5db10f5400017b1602580120.jpg

在将部署目标设置为6.0之前的iOS版本中使用启用了自动布局的界面文件会导致编译错误,例如:

MainStoryboard.storyboard中的错误:3:iOS 6.0之前的版本上的自动版式

在项目中使用自动布局并仍保持与iOS4-5兼容性的一种选择是创建两个目标:一个用于部署目标iOS 6.0,一个用于较早的iOS版本,例如:

//img1.sycdn.imooc.com//5db10f560001a02001290062.jpg

您也可以为每个故事板和XIB文件创建两个版本,并使用对6.0目标启用的自动布局以及对旧目标启用的自动布局,例如:

//img1.sycdn.imooc.com//5db10f590001ad5702360037.jpg

然后,您将MainStoryBoardAutoSize添加到iOS6目标的Build阶段,并将另一个文件添加到iOS4目标。您可以在此处了解有关使用多个目标的更多信息。

编辑:正如marchinram的答案所指出的,如果您从代码加载情节提要文件,并且不使用Xcode中的“主情节提要”设置来设置初始情节提要,则可以使用单个目标。

对我而言,维护多个目标和接口文件的复杂性增加的成本似乎超过了使用自动布局的好处。除少数特殊情况外,如果需要iOS4-5兼容性,最好只使用普通的旧自动调整大小(或代码中的layoutSubViews)。


查看完整回答
反对 回复 2019-10-24
?
ibeautiful

TA贡献1993条经验 获得超5个赞

您真的需要两个目标吗?我像这样工作,我有2个故事板,如ImreKelényi所说,一个启用了自动布局,另一个没有启用,然后在应用程序委托中,我只是检查他们使用的是哪个版本并选择正确的故事板:


#import "AppDelegate.h"


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


@interface AppDelegate ()

    @property (strong, nonatomic) UIViewController *initialViewController;

@end


@implementation AppDelegate


@synthesize window = _window;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    UIStoryboard *mainStoryboard = nil;

    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) {

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

    } else {

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

    }


    self.initialViewController = [mainStoryboard instantiateInitialViewController];

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    self.window.rootViewController = self.initialViewController;

    [self.window makeKeyAndVisible];


    return YES;

}


@end

有2个目标也可以,但对我来说似乎太过分了


查看完整回答
反对 回复 2019-10-24
  • 3 回答
  • 0 关注
  • 458 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信