IOS 6 में ऑटो लेआउट को सक्षम करना जबकि iOS 5 के साथ पीछे की ओर संगत


153

IOS 6 के नए ऑटो लेआउट सुविधाओं का लाभ उठाने का सबसे अच्छा तरीका क्या है, जबकि अभी भी iOS के पुराने संस्करणों पर पुराने उपकरणों के साथ संगतता प्रदान करता है?


+1। आप यह पता लगाने में कहां सक्षम हैं? कोई सुराग ?
जनक निर्मल

@ जैसन अभी नहीं। iOS 6 आधिकारिक तौर पर कल (9/19/2012) जारी किया जाएगा। उम्मीद है कि इस विषय पर कुछ अतिरिक्त प्रलेखन शामिल हैं।
sglantz

मुझे अभी तक कुछ नहीं मिला है। पूछताछ करने वाले मन जानना चाहेंगे!
बेन क्रीगर

मुझे नहीं लगता कि यह संभव होगा। IOS4 पर बहुत कुछ स्टोरीबोर्ड संभव नहीं था।
लियो नातान

दो निब फ़ाइलें प्रदान करने के बाहर, मैं यह नहीं देखता कि यह कैसे संभव होगा। लेकिन मैं तुमसे सहमत हूँ।
सिंह नट

जवाबों:


120

प्रत्येक .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 अनुकूलता की आवश्यकता होने पर सादे पुराने ऑटो साइज़िंग (या कोड से लेआउटसुब्यू) का उपयोग करने के लिए बेहतर हैं।


29
ऑटो लेआउट को iOS 6 या बाद के संस्करण की आवश्यकता होती है। यह iOS 5 के साथ काम नहीं करता है! कृपया पोस्ट करने से पहले अपने दावों की पुष्टि करें। iOS 5 में बस आवश्यक API नहीं हैं (जैसे कि क्लास NSLayoutConstraint)। यदि आप मुझ पर विश्वास नहीं करते हैं, तो जांचें कि अन्य उपयोगकर्ता क्या अनुभव करते हैं जब वे iOS 5 के साथ ऑटोलेयूट का उपयोग करने का प्रयास करते हैं: stackoverflow.com/questions/11252057/… stackoverflow.com/questions/11198981/…
Imre Kelnynyi

1
हां मुझे लगता है कि आप सही हैं, मुझे लगता है कि मैंने इसे कुछ wwdc वीडियो में सुना है, लेकिन अब मैंने इसे iOS 5.0 डिवाइस पर टेस्ट किया और यह क्रैश हो गया। मैं इन वीडियो के माध्यम से जाऊँगा और जाँच करूँगा कि मैंने इसे कहाँ सुना है फिर भी आप सही कह रहे हैं कि यह iOS 5.0 पर क्रैश होता है
असद खान

@ ImreKelényi आप इसे ऐप स्टोर में कैसे सबमिट करेंगे? मैं इस प्रक्रिया से सुपर परिचित नहीं हूं, लेकिन मुझे लगा कि आप अपनी .app फ़ाइल का एक ज़िपित संग्रह जमा कर सकते हैं। क्या दो लक्ष्य होने से वह प्रक्रिया कठिन हो जाती है? धन्यवाद।
क्रिस्टल

47

क्या आपको वास्तव में दो लक्ष्यों की आवश्यकता है? मुझे यह इस तरह से काम कर रहा है, मेरे पास 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 में लक्ष्य की "मेन स्टोरीबोर्ड" सेटिंग का उपयोग नहीं करते हैं। मैं अपनी पोस्ट से आपके उत्तर का संदर्भ जोड़ता हूं।
इमर केलानी

SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TOओवरकिल है। बस निल के खिलाफ एक आईओएस 6-केवल कक्षा का परीक्षण करें। डेवलपर
मैट

हाँ अच्छा अंक, वास्तव में बहाली के बारे में सोच भी नहीं रहा था जब मैं शुरू में जवाब
marchinram

अहम, वसीयत का प्रयोग न करें ।फिनिश लंचिंगऑथाइसेस - मुझे "NSInvalidUnarchiveOperationException 'अपवाद के बिना अपवाद के कारण" टर्मिनेटिंग ऐप मिला, कारण:' iOS 5.1 के तहत सिम्युलेटर चलाने के लिए NSLayoutConstraint '' क्लास को तत्काल नहीं कर सका। समस्या didFinishLaunchingWithOptions के साथ नहीं होती है।
एलिस वैन लोईज


3

@ 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' नाम की तात्कालिक क्लास नहीं कर सका, चाहे मैंने कोई भी कोशिश की हो।



0

मैंने Xibs के मुख्य दृश्य आकार को फ़्रीफ़ॉर्म पर सेट करना पाया है, और फिर ऑटोसाइज़िंग का उपयोग करके एक इलाज का काम करता है। किसी दृश्य समस्या के लिए कोड में कोई गड़बड़ नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.