इंटरफ़ेस बिल्डर: UIView के लेआउट iOS 6/7 डेल्टास के लिए क्या हैं?


111

मैंने अभी-अभी IIV 6/7 डेल्टा प्रॉपर्टी पर ध्यान दिया है जो UIView के स्ट्रक्चर लेआउट के तहत मिली है।

यह किस लिए है और यह AutoLayout से क्यों गायब है?

यहां छवि विवरण दर्ज करें

जवाबों:


83

यह वास्तव में iOS6 से iOS7 तक लेआउट स्थिति के बीच डेल्टा को संदर्भित करता है।

IOS7 में, कुछ दृश्य स्टेटस बार को छिपा सकते हैं या इसे पारदर्शी बना सकते हैं और वास्तव में, यह आपके विचार के शीर्ष पर मढ़ा हुआ है। इसलिए यदि आप iOS6 में (0.0, 0.0) पर UI तत्व डालते हैं, तो यह स्टेटस बार के नीचे दिखाई देगा, लेकिन iOS7 में यह स्टेटस बार के नीचे आंशिक रूप से कवर होगा। तो उस स्थिति में आप एक डेल्टा चाहते हैं जो स्टेटस बार की ऊँचाई (20.0 अंक) से मेल खाता हो ताकि लेआउट iOS6 और iOS7 में समान दिखे।

मेरा मानना ​​है कि यदि आप ऑटोलाययूट का उपयोग करते हैं, तो इसकी आवश्यकता नहीं है, लेकिन निश्चित रूप से, आप iPad1 समर्थन खो देते हैं, जो हम में से कई इस समय इस स्थिति में स्वीकार करने के लिए तैयार नहीं हैं।


27
मेरे लिए, मैंने पाया कि यह आईओएस 7 से आईओएस 6 तक डेल्टा है। मैंने अपने तत्वों को 20 अंक कम कर दिया, फिर डेल्टा वाई के लिए -20 सेट किया।
गुप्त

यह UIProgressView के साथ विशेष रूप से उपयोगी है जो कि iOS 7 में ज्यादा स्लिमर है
ली प्रॉबर्ट

108

नोट: मैंने इस सवाल पर कुछ समय पहले गौर किया था, लेकिन मैं केवल अपना जवाब अब पोस्ट कर रहा हूं क्योंकि एनडीए को हटा दिया गया है

यह AutoLayout के लिए क्यों नहीं दिखाई देता है?

जैसा कि आपने देखा होगा कि iOS 7 एक नया रूप लाता है। यूआई तत्वों का रूप बदल गया है, लेकिन उनके आकार (या सामान्य रूप से मैट्रिक्स) में से कुछ भी हैं। यह दोनों iOS 7 को समायोजित करने के लिए इंटरफ़ेस डिज़ाइन बना सकता है और यह पूर्ववर्तियों को थोड़ा दर्द कर सकता है।

Apple की आधिकारिक लाइन इसे हल करने के लिए AutoLayout का उपयोग करना है; यह आपके लिए यूआई तत्वों को बाहर रखने में बहुत परेशानी उठाएगा। कभी-कभी इसे शामिल करना आसानी से नहीं होता है, खासकर यदि आपको अभी भी व्यावसायिक कारणों से iOS 5 का समर्थन करना चाहिए, या आपके इंटरफेस को इस तरह से प्रबंधित किया जाता है जो ऑटोलेयूट को लागू करना मुश्किल बनाता है। जैसे कि, लगता है कि यदि आप इस आला श्रेणी में आते हैं, तो Apple ने आपके काम को थोड़ा आसान बनाने का एक तरीका प्रदान किया है, और उन्होंने इस iOS को 6/7 Deltas कहा है।

ठीक है, तो यह क्या करता है?

जबकि इंटरफ़ेस बिल्डर में लेबल थोड़ा स्पष्ट है कि इस संदर्भ में 'डेल्टा' का क्या अर्थ है, .xib फ़ाइल में शामिल कोड जो इस सुविधा से मेल खाता है, थोड़ा अधिक स्पष्ट है:

<inset key="insetFor6xAndEarlier" minX="-50" minY="-100" maxX="-50" maxY="300"/>

मुख्य नाम insetFor6xAndEarlierस्पष्ट रूप से बताता है कि यह क्या करता है; iOS 7 के पूर्ववर्तियों पर चलने पर आप UI तत्वों के लिए वैकल्पिक इनसेट प्रदान कर सकते हैं। उदाहरण के लिए, उपरोक्त डेल्टा परिवर्तन को परिभाषित करता है:

x: 50
y: 100
width: -100
height: 200

जबकि .xib में संचित मूल्य सीधे उद्धृत मूल्यों के अनुरूप नहीं हैं, उनके बीच एक संबंध है।

x: -minX
y: -minY
width: minX + maxX
height: minY + maxY

नीचे दी गई छवियां इस बदलाव को नेत्रहीन रूप से दिखाती हैं। यह काफी चरम उदाहरण है, लेकिन इसकी क्षमता का प्रदर्शन करना है। मैं केवल कुछ ही पिक्सल के डेल्टा परिवर्तन के लिए अभ्यास में उम्मीद करूंगा।

iOS7 देखें

iOS6 देखें

आप देख सकते हैं कि मान iOS 6 देखने के लिए उलटा है; यह इसलिए है क्योंकि आप जिस प्रकार के दृश्य के साथ काम कर रहे हैं उसके अनुसार डेल्टास संबंधित हैं। यदि आप आईओएस 6 के लिए संपादन कर रहे हैं, तो आईओएस 7 के लिए तत्व को सही तरीके से बदलने के लिए डेल्टा वहाँ हैं (ऊपर दिए गए उदाहरण के विपरीत)।

विभिन्न शैलियों को देखने के लिए, आप इंटरफ़ेस बिल्डर द्वारा ओएस के आधार पर इसे प्रस्तुत करने के तरीके को बदल सकते हैं। यह फ़ाइल इंस्पेक्टर के भीतर निहित है-> इंटरफ़ेस बिल्डर डॉक्यूमेंट (दाहिनी पट्टी पर पहली पट्टी), इस प्रकार:

इंटरफ़ेस शैली स्विच

क्या यह मौजूद है अगर मुझे अपना इंटरफ़ेस हाथ से कोड करना पसंद है?

सीधे नहीं, लेकिन आप अपने कोड के भीतर OS संस्करण पर सशर्त जाँच करके और उसी के अनुसार सही स्थिति / आकार सेट करके आसानी से समान प्रभाव प्राप्त कर सकते हैं। इंटरफ़ेस बिल्डर में डेल्टा की क्षमता मौजूद है क्योंकि वहाँ ऐसा करने के लिए कोड के बिना सशर्त स्थिति होने का कोई सीधा रास्ता नहीं होगा, और इंटरफ़ेस बिल्डर का बिंदु यूआई के लिए जितना संभव हो उतना अधिक कोड प्राप्त करना है।

कुल मिलाकर ...

Apple दृढ़ता से अनुशंसा करता है कि आप AutoLayout का उपयोग करें, यह आपके जीवन को ज्यादातर मामलों में आसान बनाता है। यदि आप इसका उपयोग नहीं कर सकते हैं (ऊपर वर्णित कारणों के लिए), तो डेल्टा आपको अपने UI तत्वों को वर्तमान ओएस के मैट्रिक्स के आधार पर उचित रूप से कोड में मैन्युअल रूप से उन्हें पुन: प्रस्तुत करने की आवश्यकता के बिना, लचीलेपन के साथ प्रदान करता है। एक अच्छा उदाहरण स्थिति पट्टी की कमी के लिए समायोजित करना है, लेकिन बहुत सारे अन्य उपयोग के मामले हैं।

स्वाभाविक रूप से, यदि आप केवल iOS7 और इसके बाद के संस्करण के लिए विकसित कर रहे हैं, तो आपको इस सुविधा को जानने की आवश्यकता नहीं है / यह खोज नहीं करेगा। केवल तभी जब आपके पास iOS7 SDK के साथ ऑटोलैयट के बिना बनाया गया iOS6 डिवाइस आपके एप्लिकेशन को चलाने के लिए आवश्यक है, क्या आपको डेल्टा की आवश्यकता है।

लेखन के समय (21 अगस्त), मैं इस सुविधा के संबंध में कोई दस्तावेज नहीं ढूँढ सकता, और न ही WWDC सामग्री में कोई उल्लेख। मेरे पास एक नाटक है, और थोड़ी खोजबीन के बाद, यही मैंने खोजा है।


2
आपका बहुत बहुत धन्यवाद WDUK
Kamar Shad

अब तक कोई गुण नहीं, जो मुझे पता होना चाहिए
जेस्पर

30

मुझे पता है कि यह पहले से ही उत्तर दिया गया है, बस एक छोटे से संस्करण को जोड़ने से यह उम्मीद है कि यह उन लोगों की भी मदद कर सकता है जो ऑटो लेआउट का उपयोग नहीं करते हैं और अभी भी आईओएस 6.1 और पुराने संस्करणों का समर्थन करना चाहते हैं।

इस Apple के संक्रमण गाइड को पढ़ें - पूर्व संस्करण का समर्थन

'IOS 7.0 और बाद में' के रूप में 'देखें' चुनें

यहां छवि विवरण दर्ज करें

आईओएस के लिए बेस यूआई 7. आईओएस 6 के लिए उपयुक्त डेल्टा मूल्य दें। यह देखने के लिए पूर्वावलोकन का उपयोग करें कि यह iOS 7 और iOS 6 डिवाइस में कैसे प्रस्तुत करेगा।

यहां छवि विवरण दर्ज करें

त्वरित कदम:

रूट दृश्य के प्रत्येक तात्कालिक बच्चों को व्यक्तिगत रूप से चुनें और इसके 'वाई' मान में 20px जोड़ें।

यहां छवि विवरण दर्ज करें

फिर, सामूहिक रूप से सभी तत्काल बच्चों का चयन करें और डेल्टा वाई को -20px के रूप में दें। आप इसे बैच में या व्यक्तिगत रूप से भी कर सकते हैं।

यहां छवि विवरण दर्ज करें


9

AutoLayout को कम से कम iOS 6.0 की आवश्यकता होती है। यदि आप iOS 5.0 का समर्थन करना चाहते हैं तो आप AutoLayout का उपयोग नहीं कर सकते।

और उन deltas का उपयोग विभिन्न iOS संस्करण (मुख्य रूप से iOS 7 और iOS संस्करण 7 से कम) पर दृश्य स्थिति को समायोजित करने में आपकी सहायता के लिए किया जाता है।

मैं इस तस्वीर की तरह मेरी मदद करने के लिए उन मूल्य का उपयोग करता हूं। यहां छवि विवरण दर्ज करें


1
जब मैं इन सब को बदल देता हूं तो क्या कोई और कदम इसमें शामिल होता है?
पुनर्नवीनीकरण स्टील

@RecycledSteel यहां मेरा जवाब देखें: लिंक
रिस्कॉव

3

IOS 6/7 डेल्टा को एक्शन में देखने के लिए, मैं एक SegmentedControl के साथ डेमो करूंगा जो iOS 6 और iOS 7 दोनों डिवाइस पर ठीक से दिखाई देता है।

सबसे पहले, स्टोरीबोर्ड में अपना .Xib या ViewController चुनें। सही का निशान हटाएँ उपयोग autolayout -डाउन से " आईओएस के रूप में देखें 7 और बाद में "

यहां छवि विवरण दर्ज करें

इंटरफ़ेस बिल्डर कैनवास में, अपने सेगमेंटेड कांटोल को रखें ताकि इसका मूल 20 हो। iOS 6/7 डेल्टा में, DeltaY के लिए -20 चुनें

यहां छवि विवरण दर्ज करें

यह आपके सेगमेंटेड कांट्रोल को आईओएस 6 और आईओएस 7 डिवाइस दोनों में स्टेटस बार के नीचे रखा जाएगा

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

आईओएस 7 स्टेटस बार के लिए डेवलपर की गाइड से एक और उपयोगी उद्धरण

डेल्टास को प्रत्येक दृश्य और काम के लिए व्यक्तिगत रूप से सेट किया जा सकता है जैसा कि आप अपेक्षा करते हैं। यदि आपका स्टोरीबोर्ड या नायब iOS 6 के रूप में देखने के लिए सेट है, तो डेल्टा सेट करने से वह दृश्य iOS 8 में चलने पर सेट डेल्टा राशि से स्थानांतरित हो जाएगा और / या फिर बदल दिया जाएगा। वैकल्पिक रूप से, यदि आपका स्टोरीबोर्ड या नायब देखने के लिए सेट है। iOS 7 में, तब iOS 6 में चलने पर डेल्टास लागू किया जाएगा


0

यदि आप AutoLayout का उपयोग कर रहे हैं, तो Delta उपलब्ध नहीं है। इसे आज़माएं (iOS6 चलाने वाले iPhone 4s में परीक्षण किया गया):

- (void) viewWillLayoutSubviews {

//iOS 6 workaround offset
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) {

    self.view.clipsToBounds = YES;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenHeight = 0.0;
    screenHeight = screenRect.size.width;
    CGRect screenFrame = CGRectMake(0, -20, self.view.frame.size.width,self.view.frame.size.height+10);

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