iOS 5와 하위 호환성을 유지하면서 iOS 6에서 자동 레이아웃 활성화


153

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


+1. 어디서 알아낼 수 있습니까? 어떤 단서?
Janak Nirmal

@Jennis 아직. iOS 6은 공식적으로 내일 출시 될 예정입니다 (2012 년 9 월 19 일). 바라건대 주제에 대한 추가 문서가 포함되어 있기를 바랍니다.
sglantz

아직 아무것도 찾지 못했습니다. 궁금한 마음이 궁금합니다!
벤 크리거 September

나는 그것이 가능할 것이라고 생각하지 않습니다. iOS4에서는 스토리 보드를 사용할 수 없었습니다.
레오 나탄

두 개의 펜촉 파일을 제공하는 것 외에는 어떻게 가능한지 알 수 없습니다. 그러나 나는 당신에 동의합니다.
레오 나탄

답변:


120

각 .storyboard 또는 .xib 파일에서 자동 레이아웃을 활성화하거나 비활성화 할 수 있습니다. 특정 파일을 선택하고 Xcode의 파일 관리자를 사용하여 "자동 레이아웃 사용"속성을 수정하십시오.

파일 관리자의 자동 레이아웃 속성

6.0 이전의 배치 대상이 iOS 버전으로 설정된 자동 레이아웃 가능 인터페이스 파일을 사용하면 컴파일 오류가 발생합니다. 예를 들면 다음과 같습니다.

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

프로젝트에서 자동 레이아웃을 사용하고 여전히 iOS4-5와의 호환성을 유지하는 옵션 중 하나는 두 개의 대상 을 작성 하는 것입니다 . 하나는 배치 대상 iOS 6.0 및 다른 하나는 이전 iOS 버전입니다.

여기에 이미지 설명을 입력하십시오

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

여기에 이미지 설명을 입력하십시오

그런 다음 MainStoryBoardAutoSize를 iOS6 대상의 빌드 단계에 추가하고 다른 파일을 iOS4 대상에 추가하십시오. 여러 대상 사용에 대한 자세한 내용은 여기를 참조하십시오 .

편집 : marchinram의 답변에서 지적했듯이 코드에서 스토리 보드 파일을로드하고 Xcode의 "주 스토리 보드"설정을 사용하여 초기 스토리 보드를 설정하지 않으면 단일 대상을 사용할 수 있습니다.

나를 위해 여러 대상과 인터페이스 파일을 유지 관리하는 데 따른 복잡성의 추가 비용이 자동 레이아웃 사용의 이점보다 큰 것 같습니다. 몇 가지 특별한 경우를 제외하고 iOS4-5 호환성이 필요한 경우 일반 오래된 자동 크기 조정 (또는 코드의 layoutSubViews)을 사용하는 것이 훨씬 좋습니다.


29
자동 레이아웃에는 iOS 6 이상이 필요합니다. iOS 5에서는 작동하지 않습니다! 게시하기 전에 소유권 주장을 확인하십시오. iOS 5에는 필요한 API가 없습니다 (예 : NSLayoutConstraint 클래스). 당신이 저를 믿지 않는 경우에 그들은에서 iOS 5와 함께 자동 레이아웃을 사용하려고 할 때, 어떤 다른 사용자 경험을 체크 아웃 : stackoverflow.com/questions/11252057/... stackoverflow.com/questions/11198981/...을
임레 Kelényi

1
예, 당신이 옳다고 생각합니다. 일부 wwdc 비디오에서 들었다고 생각하지만 이제는 iOS 5.0 장치에서 테스트했는데 충돌했습니다. 나는이 비디오를 통해 어디에서 들었는지 확인합니다 그럼에도 불구하고 당신이 옳다는 것은 iOS 5.0에서 충돌이 발생합니다
Asad Khan

@ ImreKelényi 앱 스토어에 어떻게 제출 하시겠습니까? 프로세스에 익숙하지 않지만 .app 파일의 압축 된 아카이브 하나를 제출한다고 생각했습니다. 두 개의 대상이 있으면 프로세스가 더 어려워 집니까? 감사.
Crystal

47

정말로 두 개의 목표가 필요합니까? 나는 이와 같이 작동하고 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 개의 목표를 가진 것은 잘 작동하지만 나에게 과잉 인 것 같습니다


1
네 말이 맞아 코드에서 스토리 보드를로드하고 Xcode에서 대상의 "메인 스토리 보드"설정을 사용하지 않는 한 작동합니다. 내 게시물의 답변에 대한 참조를 추가합니다.
Imre Kelényi

SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO과잉입니다. nil에 대해 iOS 6 전용 클래스를 테스트하십시오. developer.apple.com/library/mac/#documentation/developertools/…를
matt

그래, 좋은 점은, 내가 처음에 대답했을 때 회복에 대해 실제로 생각하지 않았다
marchinram

Ahem, willFinishLaunchingWithOptions를 사용하지 마십시오-iOS 5.1에서 시뮬레이터를 실행하는 '포착되지 않은 예외'NSInvalidUnarchiveOperationException '으로 인해 종료 응용 프로그램이 있습니다. didFinishLaunchingWithOptions에서는 문제가 발생하지 않습니다.
엘리스 반 루이


3

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

또한 struts-and-springs 스토리 보드의 배포 대상을 iOS 5.1로, 자동 레이아웃 스토리 보드의 배포 대상을 Project SDK (iOS 6.0)로 설정했습니다.

스토리 보드의 기본값이 willFinishLaunchingWithOptions에로드되기 전에 스위치를 실제로하고 싶었지만 'NSInvalidUnarchiveOperationException'이 발생했습니다.



0

Xibs 기본보기 크기를 Freeform으로 설정 한 다음 자동 크기 조정을 사용하면 문제가 없습니다. 뷰 문제에 대한 코드가 엉망이 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.