İ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?
İ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?
Yanıtlar:
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:
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:
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:
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.
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
SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO
aşırı dolu. Yalnızca iOS 6 sınıfını nil'e karşı test edin. Bkz. Developer.apple.com/library/mac/#documentation/developertools/…
Düzen farklılıkları büyük değilse, öğeleri konumlandırmak için Yaylar ve Dikmeler kullanmak çok daha kolaydır .
@ 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.
RRAutoLayout'u kullanmaya çalışın: https://github.com/RolandasRazma/RRAutoLayout iOS6'ya iOS6 AutoLayout backport'udur.