İOS 5 ile geriye dönük olarak uyumlu kalırken iOS 6'da otomatik düzeni etkinleştirme


153

İOS'un önceki sürümlerinde eski cihazlarla uyumluluk sağlarken, iOS 6'nın yeni otomatik düzen özelliklerinden yararlanmanın en iyi yolu nedir?


+1. Bunu nerede bulabilirsin? Bir ipucu ?
Janak Nirmal

@Jennis Henüz değil. iOS 6 resmi olarak yarın piyasaya sürülecek (19.09.2012). Umarım bu konuda bazı ekstra belgeler içerir.
sglantz

Henüz bir şey bulamadım. Sorgulayan beyinler bilmek ister!
Ben Kreeger

Bunun mümkün olacağını düşünmüyorum. İOS4'te hikaye tahtalarına benzer bir şey mümkün değildi.
Leo Natan

İki uç dosyası sağlamanın dışında bunun nasıl mümkün olabileceğini göremiyorum. Ama sana katılıyorum.
Leo Natan

Yanıtlar:


120

Otomatik düzenleme, her .storyboard veya .xib dosyasında etkinleştirilebilir veya devre dışı bırakılabilir. Sadece belirli bir dosyayı seçin ve Xcode'daki Dosya denetçisini kullanarak "Otomatik Yerleşimi Kullan" özelliğini değiştirin:

Dosya denetçisindeki autolayout özelliği

Otomatik hedefleme etkinleştirilmiş arabirim dosyalarının dağıtım hedefi 6.0'dan önceki bir iOS sürümüne ayarlanmış olarak kullanılması derleme hatalarına neden olur, örneğin:

MainStoryboard.storyboard'da hata: 3: 6.0'dan önceki iOS Sürümlerinde Otomatik Düzen

Bir projede otomatik yerleşimi kullanma ve yine de iOS4-5 ile uyumluluğu koruma seçeneklerinizden biri iki hedef oluşturmaktır : bir tanesi dağıtım hedefi iOS 6.0 ve diğeri daha önceki bir iOS sürümü için, ör:

resim açıklamasını buraya girin

Film şeridinizin ve XIB dosyalarınızın her biri için iki sürüm oluşturabilir ve 6.0 hedefiyle ve diğeri ile eski hedefle etkinleştirilen otomatik yerleşimi kullanabilirsiniz, örneğin:

resim açıklamasını buraya girin

Daha sonra iOS6 hedefinin Derleme aşamalarına MainStoryBoardAutoSize ve diğer dosyayı iOS4 hedefine eklersiniz. Burada birden fazla hedef kullanma hakkında daha fazla bilgi edinebilirsiniz .

EDIT: marchinram'ın cevabının işaret ettiği gibi, size storyboard dosyalarını koddan yüklerseniz ve Xcode'daki "Storyboard" ayarını ilk film şeridini ayarlamak için kullanmazsanız, tek bir hedef kullanabilirsiniz.

Benim için, birden fazla hedefi ve arayüz dosyasını korumanın ek karmaşıklığının maliyeti, otomatik yerleşim kullanmanın avantajlarından daha ağır basıyor gibi görünüyor. Birkaç özel durum dışında, yalnızca iOS4-5 uyumluluğu gerekiyorsa, yalnızca düz eski otomatik boyutlandırma (veya koddan layoutSubViews) kullanmak çok daha iyidir.


29
Otomatik düzen için iOS 6 veya üstü gerekir. İOS 5 ile çalışmaz! Lütfen göndermeden önce taleplerinizi doğrulayın. iOS 5, gerekli API'lara (NSLayoutConstraint sınıfı gibi) sahip değildir. Bana inanmıyorsanız, diğer kullanıcıların iOS 5 ile Autolayout'u kullanmaya çalıştıklarında neler yaşadıklarını kontrol edin: stackoverflow.com/questions/11252057/… stackoverflow.com/questions/11198981/…
Imre Kelényi

1
Evet bence haklısın, bazı wwdc videolarında duydum, ancak şimdi iOS 5.0 cihazında test ettim ve çöktü. Bu videoları inceleyeceğim ve nerede duyduğumu kontrol edeceğim Bununla birlikte, haklısın iOS
5.0'da

@ ImreKelényi Bunu uygulama mağazasına nasıl gönderirdiniz? Sürece çok aşina değilim, ancak .app dosyanızın sıkıştırılmış bir arşivini gönderdiğinizi düşündüm. İki hedefi olan bu süreci hiç zorlaştırıyor mu? Teşekkürler.
Kristal

47

Gerçekten iki hedefe mi ihtiyacınız var? Bu şekilde çalıştım, Imre Kelényi gibi 2 film şeridim var, biri otomatik düzenleri etkin ve diğeri olmadan, sonra uygulama temsilcisinde sadece hangi sürümü kullandıklarını kontrol edip doğru film şeridini seçiyorum:

#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 hedefe sahip olmak da işe yarıyor ama bana aşırı yüklenmiş gibi geliyor


1
Haklısın. Bu, senaryoları koddan yüklediğiniz ve Xcode'da hedefin "Ana Film Şeridi" ayarını kullanmadığınız sürece çalışır. Yazımdan yanıtınıza bir referans ekliyorum.
Imre Kelényi

SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TOaşırı dolu. Yalnızca iOS 6 sınıfını nil'e karşı test edin. Bkz. Developer.apple.com/library/mac/#documentation/developertools/…
matt

evet iyi puan, başlangıçta cevap zaman gerçekten restorasyon düşünmek değildi
marchinram

Ahem, willFinishLaunchingWithOptions kullanmayın - iOS 5.1 altında simülatörü çalıştıran yakalanmamış 'NSInvalidUnarchiveOperationException' istisnası nedeniyle "Sonlandırılan bir uygulama var", neden: 'NSLayoutConstraint adlı sınıf başlatılamadı'. DidFinishLaunchingWithOptions ile sorun oluşmaz.
Elise van Looij


3

@ Marchinram'ın tek hedef fikrinden esinlenerek, sonunda bulduğum çözüm buydu. İki film şeridi, biri gergi kolları ve yaylar için ve diğeri otomatik yerleşim için. Hedef özette, otomatik düzenleme film şeridini varsayılan olarak ayarladım. Sonra, appDelegate, ben 6.0 öncesi struts-ve-yaylar storyboard yüklemeniz gerekip gerekmediğini kontrol:

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

Ayrıca, dikmeler ve yaylar film şeridinin dağıtım hedefini iOS 5.1'e ve otomatik yerleşim film şeridinin dağıtım hedefini Project SDK'ya (iOS 6.0) ayarladım.

Anahtara varsayılan olarak yüklenmeden önce anahtarı yapmak istedim, willFinishLaunchingWithOptions içinde: ama ne denediğim önemli değil 'NSInvalidUnarchiveOperationException' ile sonuçlanır.



0

Xibs ana görünüm boyutunu Freeform olarak ayarlayarak buldum ve sonra Otomatik Boyutlandırma kullanarak bir tedavi çalışır. Bir görünüm sorunu için kod hakkında karışıklık yok.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.