IOS 6 के नए ऑटो लेआउट सुविधाओं का लाभ उठाने का सबसे अच्छा तरीका क्या है, जबकि अभी भी iOS के पुराने संस्करणों पर पुराने उपकरणों के साथ संगतता प्रदान करता है?
IOS 6 के नए ऑटो लेआउट सुविधाओं का लाभ उठाने का सबसे अच्छा तरीका क्या है, जबकि अभी भी iOS के पुराने संस्करणों पर पुराने उपकरणों के साथ संगतता प्रदान करता है?
जवाबों:
प्रत्येक .storyboard या .xib फ़ाइल पर ऑटोलॉयउट को सक्षम या अक्षम किया जा सकता है। बस विशेष फ़ाइल का चयन करें और Xcode में फ़ाइल इंस्पेक्टर का उपयोग करके "ऑटोलॉयट का उपयोग करें" संपत्ति को संशोधित करें:
संकलन त्रुटियों में 6.0 परिणामों से पहले एक iOS संस्करण के लिए सेट परिनियोजन लक्ष्य के साथ ऑटोलैयूट सक्षम इंटरफ़ेस फ़ाइलों का उपयोग करना, उदाहरण के लिए:
MainStoryboard.storyboard: 3 में त्रुटि 6.0 से पहले iOS संस्करणों पर ऑटो लेआउट
किसी प्रोजेक्ट में ऑटोलेयूट का उपयोग करने के लिए आपका एक विकल्प और फिर भी iOS4-5 के साथ संगतता बनाए रखना दो लक्ष्य बनाना है : एक तैनाती लक्ष्य iOS 6.0 और एक पहले वाले iOS संस्करण के लिए, जैसे:
आप अपने स्टोरीबोर्ड और XIB फ़ाइलों में से प्रत्येक के लिए दो संस्करण बना सकते हैं और 6.0 लक्ष्य के साथ सक्षम autolayout का उपयोग कर सकते हैं और दूसरा विरासत लक्ष्य के साथ, उदाहरण के लिए:
फिर आप iOS6 लक्ष्य के बिल्ड चरणों में MainStoryBoardAutoSize और iOS4 लक्ष्य के लिए दूसरी फ़ाइल जोड़ते हैं। आप यहां कई लक्ष्यों का उपयोग करने के बारे में अधिक जान सकते हैं ।
EDIT: जैसा कि मारचिनम का उत्तर बताता है, यदि आप स्टोरीबोर्ड फ़ाइलों को कोड से लोड करते हैं और प्रारंभिक स्टोरीबोर्ड सेट करने के लिए Xcode में "मेन स्टोरीबोर्ड" सेटिंग का उपयोग नहीं करते हैं, तो आप एकल लक्ष्य का उपयोग कर सकते हैं।
मेरे लिए, कई लक्ष्यों और इंटरफ़ेस फ़ाइलों को बनाए रखने की अतिरिक्त जटिलता की लागत ऑटोलैयूट का उपयोग करने के लाभों को रेखांकित करती है। कुछ विशेष मामलों को छोड़कर, आप शायद iOS4-5 अनुकूलता की आवश्यकता होने पर सादे पुराने ऑटो साइज़िंग (या कोड से लेआउटसुब्यू) का उपयोग करने के लिए बेहतर हैं।
क्या आपको वास्तव में दो लक्ष्यों की आवश्यकता है? मुझे यह इस तरह से काम कर रहा है, मेरे पास 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 के एक लक्ष्य विचार से प्रेरित होकर, यह वह समाधान है जो मैं आखिरकार ले आया। दो स्टोरीबोर्ड, एक स्ट्रट्स-एंड-स्प्रिंग्स के लिए और एक ऑटोलैयूट के लिए। लक्ष्य सारांश में, मैं स्वतः पूर्ण कहानी को डिफ़ॉल्ट के रूप में सेट करता हूं। फिर, ऐपलेगेट में, मैं जांच करता हूं कि क्या मुझे पहले से 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];
}
इसके अलावा, मैंने स्ट्रट्स-एंड-स्प्रिंग्स स्टोरीबोर्ड के तैनाती लक्ष्य को iOS 5.1 और प्रोजेक्ट एसडीके (iOS 6.0) के लिए ऑटोलेयआउट स्टोरीबोर्ड के रूप में निर्धारित किया है।
स्टोरीबोर्ड में डिफ़ॉल्ट लोड होने से पहले मैं वास्तव में स्विच करना चाहता था, willFinishLaunchingWithOptions: लेकिन इसका परिणाम 'NSInvalidUnarchiveOperationException' में होता है, क्योंकि: 'NSLayoutConstraint' नाम की तात्कालिक क्लास नहीं कर सका, चाहे मैंने कोई भी कोशिश की हो।
RRAutoLayout का उपयोग करने का प्रयास करें: https://github.com/RolandasRazma/RRAutoLayout यह iOS6 के लिए iOS6 AutoLayout बैकपोर्ट है।