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

2019-06-18 03:45发布

什么是采取的iOS 6中的新的自动排版功能优势,同时仍然在早期版本的iOS提供保持兼容与旧设备的最佳方式是什么?

Answer 1:

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

使用自动布局启用接口文件设置为使用iOS版本的部署目标6.0之前导致编译错误,例如:

错误MainStoryboard.storyboard:3:自动布局在iOS 6.0以前的版本

你的一个选项在项目中使用自动布局和仍然保留与iOS4-5兼容性是创建两个目标 :为部署目标一个的iOS 6.0,一个用于较早的IOS版本,如:

您可以为每个故事板和XIB文件的创建两个版本,以及使用和与6.0的目标和其他与传统目标,例如启用了自动布局:

然后,添加MainStoryBoardAutoSize到iOS6的目标构建阶段和其他文件到iOS4的目标。 您可以了解更多有关使用多个目标位置 。

编辑:作为marchinram的回答指出,如果从代码加载你的故事板文件,不使用“主故事板”在Xcode设置来设置最初的脚本,可以使用单一目标。

对我来说,保持多个目标和接口文件复杂性的增加的成本似乎超过使用自动布局的好处。 除少数特殊情况下,你可能更好用普通的旧自动调整大小(或layoutSubViews从代码)独家如果需要iOS4-5兼容性。



Answer 2:

你真的需要两个目标? 我得到它的工作是这样的,我有2个分镜像伊姆雷Kelé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个目标藏汉工作,但似乎像矫枉过正我



Answer 3:

如果布局差异并不大,这是一个更容易使用的温泉和Struts定位元素。



Answer 4:

通过@ marchinram的一个目标理念的启发,这是我终于想出了解决方案。 两个故事板,一个为支柱,和弹簧和一个用于自动布局。 在目标总之,我设置了自动版式故事板作为默认值。 然后,在的appDelegate,我检查我是否需要毕竟加载预6.0的struts-和弹簧故事板:

    - (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];
    }

另外,我支柱和 - 弹簧故事板的部署目标设定到iOS 5.1,并且该自动布局故事板到Project SDK(iOS的6.0)。

我真的很想在故事板默认加载之前,在willFinishLaunchingWithOptions做开关:但这导致一个“NSInvalidUnarchiveOperationException”,理由是:“无法实例名为NSLayoutConstraint类”不管我试过了。



Answer 5:

尝试使用RRAutoLayout: https://github.com/RolandasRazma/RRAutoLayout这是iOS6的自动版式反向移植到iOS5的。



Answer 6:

我已经找到了Xibs主视图大小设置为自由曲面,然后使用自动调整大小的作品一种享受。 在代码中没有搞乱关于视图的问题。



文章来源: Enabling auto layout in iOS 6 while remaining backwards compatible with iOS 5