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



Answers

你真的需要两个目标吗? 我有这样的工作,我有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个目标的作品,但似乎是矫枉过正给我

Question

利用iOS 6新的自动布局功能的最佳方式是什么,同时仍然能够在早期版本的iOS上提供旧设备的兼容性?




受@ marchinram的一个目标想法的启发,这是我终于想出的解决方案。 两个故事板,一个用于支柱和弹簧,一个用于自动布局。 在目标摘要中,我将自动布局故事板设置为默认值。 然后,在appDelegate中,我检查是否需要加载6.0之前的struts-and-springs故事板:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    Class cls = NSClassFromString (@"NSLayoutConstraint");
    if (cls == nil) {
        NSString *mainStoryboardName = nil;
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
            mainStoryboardName = @"MainStoryboard_iPad_StrutsAndSprings";
        } else {
            mainStoryboardName = @"MainStoryboard_iPhone_StrutsAndSprings";
        }
        UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:mainStoryboardName bundle:nil];

        UIViewController *initialViewController = [mainStoryboard instantiateInitialViewController];
        self.window.rootViewController = initialViewController;
        [self.window makeKeyAndVisible];
    }

另外,我将struts-and-springs故事板的部署目标设置为iOS 5.1,将自动布局故事板设置为Project SDK(iOS 6.0)。

我真的希望在故事板的默认加载之前执行切换,在willFinishLaunchingWithOptions中:但是会导致'NSInvalidUnarchiveOperationException',原因是:'无法尝试我所尝试的,无法实例化名为NSLayoutConstraint的类。




我发现将Xibs主视图的大小设置为Freeform,然后使用Autosizing进行处理。 在代码中查看问题时不会搞乱。




Related