programing

iOS 6에서 자동 레이아웃을 활성화하는 동시에 iOS 5와 역호환 가능

jooyons 2023. 6. 9. 22:03
반응형

iOS 6에서 자동 레이아웃을 활성화하는 동시에 iOS 5와 역호환 가능

iOS 6의 새로운 자동 레이아웃 기능을 활용하면서 이전 버전의 iOS에서 이전 장치와 호환성을 제공하는 가장 좋은 방법은 무엇입니까?

자동 레이아웃은 각 .storyboard 또는 .xib 파일에서 활성화하거나 비활성화할 수 있습니다.특정 파일을 선택하고 Xcode의 File inspector(파일 검사기)를 사용하여 "Use Autolayout(자동 레이아웃 사용)" 속성을 수정하기만 하면 됩니다.

파일 검사기의 자동 레이아웃 속성

배포 대상이 6.0 이전 버전으로 설정된 상태에서 자동 레이아웃 사용 인터페이스 파일을 사용하면 다음과 같은 컴파일 오류가 발생합니다.

MainStoryboard.storyboard:3:6.0 이전 iOS 버전의 자동 레이아웃

프로젝트에서 자동 레이아웃을 사용하면서도 iOS 4-5와의 호환성을 유지하기 위한 옵션 중 하나는 배포 대상 iOS 6.0용과 이전 iOS 버전용 두 가지 대상을 만드는 것입니다.

여기에 이미지 설명 입력

각 스토리보드 및 XIB 파일에 대해 두 가지 버전을 생성하고 6.0 대상에서 활성화된 자동 레이아웃과 레거시 대상에서 활성화된 자동 레이아웃을 사용할 수 있습니다.

여기에 이미지 설명 입력

그런 다음 메인 스토리보드를 추가합니다.iOS6 대상의 빌드 단계로 자동 크기 조정하고 다른 파일은 iOS4 대상으로 자동 크기 조정합니다.여러 대상 사용에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

편집: Marchinram의 답변에서 지적했듯이, 만약 당신이 당신의 스토리보드 파일을 코드에서 로드하고 Xcode의 "Main Storyboard" 설정을 사용하여 초기 스토리보드를 설정하지 않는다면, 당신은 하나의 대상을 사용할 수 있습니다.

여러 대상 및 인터페이스 파일을 관리하는 데 따른 추가적인 복잡성으로 인해 발생하는 비용이 자동 레이아웃 사용의 이점을 능가하는 것으로 보입니다.몇 가지 특별한 경우를 제외하고 iOS4-5 호환성이 필요한 경우에만 일반적인 기존 자동 크기 조정(또는 코드에서 layoutSubViews)을 사용하는 것이 훨씬 더 나을 수 있습니다.

정말로 두 개의 타겟이 필요합니까?이렇게 작동하게 되었습니다. Imre Kelényi가 말한 것처럼 스토리보드가 2개 있습니다. 하나는 자동 레이아웃이 활성화되어 있고 다른 하나는 활성화되어 있지 않습니다. 그러면 앱 대리자에서 사용 중인 버전을 확인하고 올바른 스토리보드를 선택할 수 있습니다.

#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개의 목표물을 갖는 것도 효과가 있지만 나에게는 과잉 살상인 것 같습니다.

레이아웃 차이가 크지 않은 경우 스프링과 스트럿을 사용하여 요소를 배치하는 것이 훨씬 쉽습니다.

@marchinram의 하나의 목표 아이디어에서 영감을 받아, 이것이 제가 마침내 생각해 낸 해결책입니다.두 개의 스토리보드, 하나는 스트럿 앤 스프링, 하나는 오토 레이아웃입니다.대상 요약에서 자동 레이아웃 스토리보드를 기본값으로 설정했습니다.그런 다음 appDelegate에서 6.0 이전 스트럿 앤 스프링 스토리보드를 로드해야 하는지 확인합니다.

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

또한 Strut-and-Spring 스토리보드의 배치 대상을 iOS 5.1로 설정하고, 자동 배치 스토리보드의 배치 대상을 Project SDK(iOS 6.0)로 설정하였습니다.

willFinishLaunchingWithOptions:에서 storyboard의 기본값이 로드되기 전에 스위치를 정말로 수행하고 싶었지만 이로 인해 'NSInvalidUnarchiveOperation'이 발생합니다.예외', 이유: 'NSLayoutConstraint'라는 클래스를 시도해도 인스턴스화할 수 없습니다.

RRAutoLayout을 사용해 보세요: https://github.com/RolandasRazma/RRAutoLayout iOS6 AutoLayout 백포트에서 iOS5로.

Xibs 기본 보기 크기를 Freeform으로 설정한 다음 Autosize(자동 크기 조정)를 사용하는 것이 좋습니다.보기 문제를 위해 코드를 함부로 사용할 필요가 없습니다.

언급URL : https://stackoverflow.com/questions/12411980/enabling-auto-layout-in-ios-6-while-remaining-backwards-compatible-with-ios-5

반응형