मैं अपने UIScrollview पर बाधाओं को सेट करने के लिए ऑटोलाययूट का उपयोग कैसे कर सकता हूं?


176

मैंने दो दिन बिताए हैं कि मिश्रित और शुद्ध ऑटोलैयट दृष्टिकोण के लिए विभिन्न समाधानों की कोशिश कर रहा है, जो ऑटोलैयट से पहले एक मामूली स्क्रॉलव्यू सेटअप था, और यह अब आधिकारिक है - मुझे बहुत बेवकूफ होना चाहिए। मैं इसे ज्यादातर स्टोरीबोर्ड में स्थापित कर रहा हूं (ठीक है, यह सिर्फ उसी तरह है)।

तो यहाँ मेरी मदद के लिए याचिका है।

Viewtree:

UIView
-UIView
-UIView
..-UIScrollview
...-UIButton
...-UIButton
...-UIButton

बटन को क्षैतिज रूप से स्क्रॉल करने के लिए माना जाता है (बाएं से दाएं और इसके विपरीत)। किसी को कर सकते हैं तो कृपया मुझे पता है की कमी इस का उपयोग कर शुद्ध autolayout प्राप्त करने के लिए सेट करने के लिए कैसे करते हैं ???

-

मैंने मिश्रित दृष्टिकोण की कोशिश की है, जैसे:

UIView
- UIView
- UIView
..-UIScrollview
...-UIView (contentview)
....-UIButton
....-UIButton
....-UIButton

... और Apple के TechNote के अनुसार contentviewऔर translatesAutoresizingMaskIntoConstraintsसेटिंग्स के लिए निश्चित चौड़ाई और ऊंचाई की सीमा निर्धारित करना। बटन और स्क्रॉलव्यू बाधाओं का उपयोग करके स्थापित किए गए हैं। यह स्क्रॉलव्यू स्क्रॉल (याय) हो जाता है, लेकिन अफसोस, यह बहुत दूर तक स्क्रॉल करता है! जहाँ तक मैं बता सकता हूँ, स्क्रॉल चौड़ाई किसी भी तरह से दोगुनी है जो मैंने सामग्री के स्तर पर सेट किया है ??? !!!

मैंने शुद्ध ऑटोलैयट दृष्टिकोण की कोशिश की, साथ contentviewऔर बिना दोनों । सभी विचार हैं translatesAutoresizingMaskIntoConstraints=NO, को छोड़कर self.view। बटन में चौड़ाई / ऊँचाई की सीमा तय की गई है, और स्क्रॉलव्यू के सभी चार किनारों पर पिन किया गया है। कुछ भी नहीं स्क्रॉल।

इसलिए मैं पूरी तरह से चकित हूं कि मुझे सही तरीके से काम करने के लिए क्यों नहीं मिल रहा है। किसी भी मदद की बहुत सराहना की जाती है, और यदि आपको किसी अन्य जानकारी की आवश्यकता है, तो कृपया पूछें!

समाधान के साथ अद्यतन स्क्रीनशॉट - बटन की कमी:

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

EDIT @ जेमी फॉरेस्ट तो समाधान अंतिम बटन पर गलत ट्रेलिंग बाधा बन जाता है। 6441 के बजाय, मैंने जो मूल्य निर्धारित किया था वह नकारात्मक था, -6441। मुश्किल बात यह है, कि स्टोरीबोर्ड में मान सेट करते समय, पिन टूलबार में दो विकल्प होते हैं:

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

वर्तमान कैनवस मूल्य नकारात्मक है (कोई स्क्रॉल नहीं करने के लिए अग्रणी), और नीचे का विकल्प सकारात्मक है (स्क्रॉल सक्रिय कर रहा है)। इसका मतलब है कि मैं बेवकूफ नहीं हूं लेकिन कम से कम आधा अंधा हूं। हालाँकि, मेरे बचाव के लिए, यह कुछ परेशान नहीं है कि XCode "गलत" सेटिंग के लिए कोई त्रुटि नहीं दिखाता है?

EDCE फिर से शुरू करें यह मज़ेदार है ... -4444 से अनुगामी मूल्य (कोई स्क्रॉल) को बदलकर 6441 सक्षम स्क्रॉल करना। लेकिन मेरा पुराना दोस्त "बहुत अधिक सामग्रीयुक्त" वापस आ गया था, एक सामग्री के आकार के रूप में दो बार बड़े होने के कारण यह क्या होना चाहिए! सही सामग्री स्क्रॉल प्राप्त करने के लिए समाधान शून्य करने के लिए अनुगामी बाधा निर्धारित किया गया था! स्टोरीबोर्ड में काम करते समय यह स्पष्ट नहीं है लेकिन @Infinity James 'कोड को देखते हुए, यह वही है जो यह होना चाहिए।


आप अपने स्क्रॉल दृश्य के लिए सामग्री आकार की गणना / सेट कहां करते हैं? एक contentView का उपयोग करके अपने पहले प्रयास का जिक्र करते हुए और आपने कहा कि यह बहुत दूर तक स्क्रॉल करता है।
टिम

2
जहाँ तक मुझे पता है, आप निर्धारित नहीं कर सकते contentSizeएक की UIScrollViewका उपयोग कर केवल ऑटो लेआउट। और यह है contentSizeकि आप कितना स्क्रॉल कर सकते हैं परिभाषित करता है। इसलिए आपको इसे अंततः कहीं पर मैन्युअल रूप से सेट करना होगा। बाकी के लिए, आप एक दूसरे के सापेक्ष दृश्य फ़्रेम सेट करने के लिए लेआउट की कमी का उपयोग कर सकते हैं।
ग्वेलियूम

@ जेफ़, सामग्री का आकार निश्चित है, यह कभी नहीं बदलता है। मैंने स्टोरीबोर्ड में सामग्री का आकार सही ढंग से सेट किया है ताकि मैं कंटिव्यू के लिए सही ऊंचाई और चौड़ाई मैन्युअल रूप से दर्ज कर सकूँ, और मैं स्टोरीबोर्ड में बाधाओं के साथ ऊंचाई और चौड़ाई को पिन करता हूं।
user1459524 17

रन टाइम पर अपनी सामग्री का प्रिंट आउट लें, देखें कि क्या यह उन मूल्यों से मेल खाता है जो आपके पास हैं। ContentSize निर्धारित करता है कि स्क्रॉल कितना होता है, इसलिए आपके पहले प्रयास के साथ समस्या सामग्री के साथ करना है।
टिम

@ गिलियूम, तो "शुद्ध ऑटोलैयट" दृष्टिकोण क्या इतना शुद्ध नहीं है? लेकिन मैं सामग्री को मैन्युअल रूप से कैसे सेट कर सकता हूं? जैसा कि मैंने ऊपर उल्लेख किया है, मैं निश्चित मान पर (स्टोरीबोर्ड में) सामग्री की ऊंचाई / चौड़ाई निर्धारित कर रहा हूं। लेकिन यह बहुत दूर (2x) तक स्क्रॉल करता है।
user1459524

जवाबों:


68

आपके अवरोधों के सटीक मान और सेटअप को देखना मुश्किल है क्योंकि आपने उन्हें यहाँ चिपकाया है, इसलिए मुझे यकीन नहीं है कि आप अपने स्क्रीनशॉट्स को देख रहे हैं जहाँ आप गलत हो गए हैं।

आपके सेटअप में क्या गलत है, इसके स्पष्टीकरण के बदले, मैंने आपके द्वारा वर्णित एक बहुत ही समान दृश्य पदानुक्रम और बाधा सेटअप के साथ एक मूल नमूना परियोजना बनाई है । क्षैतिज स्क्रॉल नमूना प्रोजेक्ट में अपेक्षित रूप से काम करता है, जो "प्योर ऑटोलाइयूट" दृष्टिकोण का उपयोग करता है जो कि एप्पल तकनीकी नोट में वर्णन करता है ।

मुझे मूल रूप से ऑटो लेआउट के साथ काम करने में बहुत परेशानी हुई UIScrollView। इसे काम पर लाने की कुंजी यह सुनिश्चित कर रही है कि स्क्रॉल दृश्य के सभी आइटम, एक साथ लिए गए, ऐसी बाधाएँ हैं जो अंततः स्क्रॉल दृश्य के सभी पक्षों से लिंक होती हैं और जो AutoLayout सिस्टम को एक सामग्री निर्धारित करने में सक्षम होने में योगदान करती हैं। स्क्रॉल दृश्य जो इसके फ्रेम से बड़ा होगा। ऐसा लगता है कि आप अपने कोड में ऐसा करने की कोशिश कर रहे थे, लेकिन हो सकता है कि आपके पास वहां कुछ अतिशय बाधाएं थीं जो सामग्री को बहुत छोटा बना रही थीं।

नोट के अलावा, जैसा कि दूसरों ने उल्लेख किया है, AutoLayout और UIScrollview के साथ, आप अब सामग्री को स्पष्ट रूप से सेट नहीं करते हैं। AutoLayout सिस्टम आपके अवरोधों के आधार पर सामग्री की गणना करता है।

मुझे यह ई-बुक चैप्टर यह समझने में बहुत मददगार साबित हुआ कि यह सब कैसे काम करता है। आशा है कि यह सब मदद करता है।


2
नमूना परियोजना के लिए धन्यवाद! यह काम करता है, और इसके माध्यम से देखते समय, मुझे पहली बार में अपनी परियोजना में कोई अंतर नहीं मिला! मैंने अपनी परियोजना में विचारों की नकल की, बाधाओं के अलावा कुछ अन्य सेटिंग पर संदेह किया, लेकिन यह काम करना जारी रखा। इससे मुझे पता चला कि मेरी परियोजना में अंतिम बटन के लिए अनुगामी बाधा एक नकारात्मक है - इसके सामने, जबकि आपका सकारात्मक मूल्य है! - धनात्मक में परिवर्तन करने से स्क्रॉल सक्रिय हो गया! जब मैं पिन टूलबार लाता हूं, तो दो विकल्प होते हैं: वर्तमान कैनवस मान का उपयोग करें, जो नकारात्मक है, और स्क्रॉल दृश्य (वर्तमान मूल्य का उपयोग करें) जो सकारात्मक है ...!
user1459524

आह येस। नकारात्मक मूल्य वास्तव में स्क्रॉल दृश्य की सामग्री को छोटा कर देगा, इस तथ्य से मेल खाने के लिए कि अनुगामी किनारे को बटन समाप्त होने से पहले समाप्त हो जाना चाहिए । ग्लैड सैंपल प्रोजेक्ट ने मदद की!
जेमी फॉरेस्ट

इसने बहुत कुछ किया। मेरे अद्यतन उत्तर की जाँच करें। अनुगामी मूल्य वास्तव में 0 (शून्य) होना चाहिए ऐसा लगता है।
user1459524

6
यह दुख की बात है कि हमें कोड के बजाय स्क्रीनशॉट साझा करना होगा। यह सिर्फ इसलिए है क्योंकि सेब डेवलपर्स को बेहतर एपी प्रदान करने के बजाय बिल्डर का उपयोग करने के लिए प्रोत्साहित करता है।
व्लादिमीर स्लाव

4
पूरी तरह से अनपेक्षित। XCode's के रचनाकारों के दिमाग में क्या चल रहा था, यह जानने के लिए डेवलपर्स को घंटों-घंटे भटकना पड़ता है।
जोश

49

मूर्खतापूर्ण क्लब में LOL का स्वागत है। मैं संस्थापकों में से एक हूं। : डी

व्यावसायिक स्क्रॉलिंग के लिए : मुझे काम करने का एकमात्र तरीका (iOS 8, Xcode 6 और शुद्ध ऑटोलेयूट) निम्नलिखित स्क्रॉल को मेरे स्क्रॉल दृश्य (सभी पर्यवेक्षण से संबंधित) में जोड़ रहा था:

  • समान चौड़ाई
  • समान ऊँचाई
  • केंद्र Y संरेखण
  • केंद्र X संरेखण

मेरी संरचना:

  UIView
   - ScrollView
    - Subview
    - Subview
    - Subview
    - Subview
    - ...

यह अंतिम परिणाम है:

डेमो

यह सेटअप है:

सेट अप पूर्ण स्क्रीन

और यहाँ परियोजना है

उम्मीद है कि यह किसी को सुबह 5 बजे तक सो जाने से बचाएगा। : डी


सहायता के लिए बहुत - बहुत धन्यवाद! आपको "सबव्यू" टाइप का सबव्यू कैसे मिला ?? मैं Xcode 6.2 में आपके प्रोजेक्ट को देख रहा हूं, और यह उन छोटी आयतों को "सबव्यू" कहता है जिनमें एकमात्र बाधा यह है कि यह 63px उच्च है।
एंड्रयू के

1
अभिवादन! वह "सबव्यू" वास्तव में एक UIVIew है। यह सिर्फ एक नाम है ... आप वहां कुछ भी लिख सकते हैं। इस चित्र को देखें: cl.ly/image/291f1K2N0V3p बाधा विषय पर, साक्षात्कारों में सिर्फ एक ऊँचाई की कमी होती है। यहाँ उन विचारों के लिए पूरी बाधा सूची की जाँच करें: cl.ly/image/3l061i123j2i
बैकस्लैश-एफ

1
मैं अभी भी स्क्रॉलिंग कार्य करने में सक्षम नहीं हूं - मैंने देखा कि आपके प्रोजेक्ट में आपके सबव्यू व्यू "ग्रेयर्ड आउट" हैं। कुछ शोध करने के बाद, ऐसा लगता है कि आप 'आकार वर्गों' का उपयोग कर रहे हैं। यह स्क्रॉलिंग को कैसे प्रभावित करता है? क्या इसका उपयोग किए बिना स्क्रॉलिंग काम करने का एक तरीका है?
एंड्रयू के

इसके अलावा, आपने डिफ़ॉल्ट लंबाई की तुलना में अपने पर्यवेक्षण को इतना लंबा कैसे किया? मैं ऐसे बटन जोड़ने की कोशिश कर रहा हूं जो "फोल्ड के नीचे" (या ऑफ स्क्रीन) दिखाई देंगे, लेकिन जाहिर है कि मैं उन्हें सुपरवाइवे में जोड़ सकता हूं अगर मैं उन्हें खींच नहीं सकता और उन्हें सुपरवाइवे पर छोड़ सकता हूं क्योंकि यह काफी बड़ा नहीं है।
एंड्रयू के

1
इस मूर्खतापूर्ण लेआउट को खोजने और करने की कोशिश करने के एक लंबे दिन के बाद, मुझे यह उत्तर मिला और पहली कोशिश में काम करता है .. धन्यवाद आदमी .. आप मेरा दिन बचाते हैं .. काश मैं इस जवाब के लिए हजार अप वोट दे पाता ..: )
बॉबी स्टेनले

32

सरल स्व-नियंत्रित उदाहरण

प्रश्न पर वोटों की अधिक संख्या और उत्तरों पर कम वोटों को देखते हुए, लोगों को यहां एक समझने योग्य और त्वरित समाधान नहीं मिल रहा है। मुझे एक जोड़ने की कोशिश करते हैं। यह प्रोजेक्ट पूरी तरह से इंटरफ़ेस बिल्डर में किया गया एक स्व-निहित उदाहरण है। आपको 10 मिनट या उससे कम समय में इसके माध्यम से काम करने में सक्षम होना चाहिए। तब आप उन अवधारणाओं को लागू कर सकते हैं जिन्हें आपने अपने प्रोजेक्ट के लिए सीखा था।

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

मूल प्रश्न स्क्रॉल बटन के बारे में पूछता है। यहाँ मैं सिर्फ UIViews का उपयोग करता हूँ लेकिन वे जो कुछ भी आपको पसंद करते हैं उसका प्रतिनिधित्व कर सकते हैं। मैंने क्षैतिज स्क्रॉलिंग भी चुनी क्योंकि स्टोरीबोर्ड स्क्रीनशॉट इस प्रारूप के लिए अधिक कॉम्पैक्ट हैं। हालांकि, ऊर्ध्वाधर स्क्रॉलिंग के लिए सिद्धांत समान हैं।

प्रमुख धारणाएँ

  • UIScrollViewकेवल एक subview उपयोग करना चाहिए। यह एक 'उविव्यू' है जो स्क्रॉल करने की इच्छा रखने वाली हर चीज को होल्ड करने के लिए कंटेंट व्यू के रूप में कार्य करता है।
  • सामग्री दृश्य बनाएं और स्क्रॉल दृश्य के माता-पिता के पास क्षैतिज स्क्रॉलिंग के लिए समान ऊंचाइयां हैं। (ऊर्ध्वाधर स्क्रॉलिंग के लिए समान चौड़ाई)
  • सुनिश्चित करें कि सभी स्क्रॉल करने योग्य सामग्री की एक सेट चौड़ाई है और सभी पक्षों पर पिन की गई है।

एक नई परियोजना शुरू करें

यह केवल एक दृश्य अनुप्रयोग हो सकता है।

स्टोरीबोर्ड

इस उदाहरण में हम एक क्षैतिज स्क्रॉल दृश्य बनाएंगे। दृश्य नियंत्रक का चयन करें और फिर आकार निरीक्षक में फ़्रीफ़ॉर्म चुनें। चौड़ाई 1,000और ऊंचाई बनाएं 300। यह बस हमें स्टोरीबोर्ड पर कमरा प्रदान करता है जिसमें सामग्री को स्क्रॉल किया जाएगा।

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

एक स्क्रॉल दृश्य जोड़ें

UIScrollViewव्यू कंट्रोलर के रूट व्यू में सभी चार पक्षों को जोड़ें और पिन करें।

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

एक सामग्री दृश्य जोड़ें

UIViewस्क्रॉल दृश्य के उप-भाग के रूप में जोड़ें । यह कुंजी है। स्क्रॉल दृश्य में बहुत सारे सबस्क्रिप्शन जोड़ने का प्रयास न करें। बस एक एकल जोड़ें UIView। यह उन अन्य दृश्यों के लिए आपका सामग्री दृश्य होगा, जिन्हें आप स्क्रॉल करना चाहते हैं। चारों ओर स्क्रॉल दृश्य पर सामग्री दृश्य पिन करें।

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

समान ऊँचाई

अब डॉक्यूमेंट आउटलाइन में, इन दोनों को चुनने के Commandलिए कंटेंट व्यू और स्क्रॉल व्यू के पेरेंट व्यू दोनों पर क्लिक करें। फिर समान होने के लिए ऊंचाइयों को सेट करें ( Controlसामग्री दृश्य से स्क्रॉल दृश्य पर खींचें)। यह भी कुंजी है। क्योंकि हम क्षैतिज रूप से स्क्रॉल कर रहे हैं, स्क्रॉल दृश्य का कंटेंट दृश्य यह नहीं जान पाएगा कि जब तक हम इसे इस तरह सेट नहीं करते हैं, तब तक यह कितना ऊंचा होना चाहिए।

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

ध्यान दें:

  • यदि हम सामग्री को लंबवत स्क्रॉल कर रहे हैं, तो हम सामग्री दृश्य की चौड़ाई को स्क्रॉल दृश्य के माता-पिता की चौड़ाई के बराबर सेट करेंगे।

सामग्री जोड़ें

तीन UIViewएस जोड़ें और उन्हें सभी अड़चनें दें। मैंने हर चीज के लिए 8 पॉइंट मार्जिन का इस्तेमाल किया।

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

प्रतिबंध:

  • हरा दृश्य: ऊपर, बाएँ और नीचे के किनारों को पिन करें। चौड़ाई 400 कर लें।
  • लाल दृश्य: ऊपर, बाएँ और नीचे के किनारों को पिन करें। चौड़ाई ३०० कर दें।
  • बैंगनी दृश्य: सभी चार किनारों को पिन करें। शेष स्थान जो भी हो (इस मामले में 268) चौड़ाई बनाओ।

चौड़ाई की बाधाओं को सेट करना भी महत्वपूर्ण है ताकि स्क्रॉल दृश्य को पता चले कि उसका सामग्री दृश्य कितना व्यापक होगा।

ख़त्म होना

बस इतना ही। अब आप अपना प्रोजेक्ट चला सकते हैं। इस उत्तर के शीर्ष पर स्क्रॉलिंग छवि की तरह व्यवहार करना चाहिए।

ऊर्ध्वाधर स्क्रॉलिंग के लिए, बस इस उदाहरण (परीक्षण और काम) में सभी चौड़ाई और ऊंचाई दिशाओं को स्वैप करें।

आगे के अध्ययन


9

सामग्री को संक्षिप्त रूप से UIScrollView के अंदर बाधाओं को लागू करके सेट किया गया है।

उदाहरण के लिए, क्या आपके पास एक यूआईईवीई के अंदर एक यूआईएसक्रोलव्यू है, यह इस तरह दिखाई देगा (जैसा कि मुझे यकीन है कि आप जानते हैं:

    UIView *containerView               = [[UIView alloc] init];
    UIScrollView *scrollView            = [[UIScrollView alloc] init];
    [containerView addSubview:scrollView];
    containerView.translatesAutoresizingMaskIntoConstraints = NO;
    scrollView.translatesAutoresizingMaskIntoConstraints    = NO;
    NSDictionary *viewsDictionary       = NSDictionaryOfVariableBindings(containerView, scrollView);

    [containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|"
                                                                          options:kNilOptions
                                                                          metrics:nil
                                                                            views:viewsDictionary]];
    [containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|"
                                                                          options:kNilOptions
                                                                          metrics:nil

वह कंटेनर दृश्य का आकार भरने के लिए स्क्रॉल दृश्य सेट करेगा (इसलिए कंटेनर दृश्य एक निश्चित आकार का होगा)।

आप तब यूआईएसक्रोलव्यू की सामग्री को समायोजित कर सकते हैं, यह स्पष्ट रूप से सेट करके कि आप बटन दबाए रख सकते हैं:

    UIButton *buttonA                   = [[UIButton alloc] init];
    UIButton *buttonB                   = [[UIButton alloc] init];
    UIButton *buttonC                   = [[UIButton alloc] init];
    [scrollView addSubview:buttonA];
    [scrollView addSubview:buttonB];
    [scrollView addSubview:buttonC];
    buttonA.translatesAutoresizingMaskIntoConstraints       = NO;
    buttonB.translatesAutoresizingMaskIntoConstraints       = NO;
    buttonC.translatesAutoresizingMaskIntoConstraints       = NO;

    viewsDictionary                     = NSDictionaryOfVariableBindings(scrollView, buttonA, buttonB, buttonC);

    [scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[buttonA]-|"
                                                                       options:kNilOptions
                                                                       metrics:nil
                                                                         views:viewsDictionary]];
    [scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[buttonA]-[buttonB]-[buttonC]-|"
                                                                       options:NSLayoutFormatAlignAllBaseline
                                                                       metrics:nil
                                                                         views:viewsDictionary]];

तो, मैं स्क्रॉलव्यू और बटन के बीच बाधाओं को सेट करता हूं, और कंटेनर व्यू और बटन नहीं? मुझे लगता है कि इस अंतर के बारे में मैं आपके कोड को दांव पर लगा रहा हूं और अभी मैं स्टोरीबोर्ड के माध्यम से कर रहा हूं।
user1459524

मुझे केवल दूसरे पढ़ने के बाद एहसास हुआ कि आप एक कन्टेन्यूव्यू स्थापित कर रहे हैं न कि कोई कंटेंटव्यू। आपके कोड के आधार पर, मैंने स्टोरीबोर्ड में सबकुछ फिर से बनाया है, और यह स्क्रॉल नहीं कर रहा है। मैं कुछ स्क्रीनशॉट के साथ अपने प्रश्न को संपादित करूँगा।
user1459524

1
तो यह कहानीबोर्ड में कोड को फिर से बनाने का मेरा प्रयास 100% सही नहीं था। अंतिम बटन के लिए अनुगामी मूल्य बिल्कुल शून्य होना चाहिए, एच: मिररिंग: - [बटन] - [बटनबी] - [बटनसी] - | जब स्टोरीबोर्ड में काम करना बहुत स्पष्ट नहीं है (या कम से कम मेरे लिए नहीं था) लेकिन अब तथ्य के बाद तुच्छ लगता है। मैं
ऑटोलेयूट से

क्या @ user1459524 का उल्लेख मेरे लिए एक मुद्दा था। मेरा निचला दृश्य एक बटन था और नीचे का अवरोध आईबी द्वारा -32 था। मैंने उसे 0 पर सेट किया और इसे IB में बॉटम स्पेस टू: सुपरवाइवे के रूप में अपडेट किया। यह काम करेगा, यह भी लगता है कि जब तक आप सकारात्मक पक्ष पर काम करते हैं। ऐसा लगता है कि आईबी के साथ एक बग हो सकता है। आशा है कि किसी और की मदद करता है। मैंने सभी विचारों को भी हटा दिया और फिर से निकाल दिया जो मुझे पता लगाने की कोशिश करते समय मदद करता है और मुझे आमतौर पर लंबा समय नहीं लगता।
माइकल

8

UIScrollView के साथ AutoLayout का उपयोग करने के बारे में बहुत सारे प्रश्न हैं, जो महत्वपूर्ण बिंदु जिसे हम अनदेखा करते हैं वह यह है कि UIScrollView के आंतरिक दृश्य सामग्री दृश्य के विरुद्ध बाधाएँ बनाते हैं लेकिन UIScrollView स्वयं नहीं। तकनीकी नोट TN2154 का संदर्भ लें , आप पा सकते हैं:

UIScrollView वर्ग अपनी सीमाओं की उत्पत्ति को बदलकर अपनी सामग्री को स्क्रॉल करता है। ऑटो लेआउट के साथ इस काम को करने के लिए, स्क्रॉल दृश्य के भीतर ऊपर, बाएँ, नीचे, और दाएं किनारों का मतलब अब इसके सामग्री दृश्य के किनारों से है।

निम्न चित्र में दर्शाया गया है कि: यहां छवि विवरण दर्ज करें

आप पा सकते हैं कि अनुगामी स्थान 500 अंक है, यदि बाधा UIScrollView के लिए बनाई गई है, तो दृश्य को रखा जाएगा और उसके फ्रेम को अपडेट किया जाना चाहिए। हालांकि, कोई चेतावनी और कोई त्रुटि नहीं। क्योंकि सभी अड़चनें कंटेंट व्यू के खिलाफ हैं।

UIScrollView आंतरिक विचारों की बाधाओं के अनुसार सामग्री दृश्य के आकार की गणना करेगा। (उदाहरण के लिए, सामग्री का आकार: चौड़ाई = 100 (अग्रणी स्थान) + 200 (दृश्य की चौड़ाई) + 500 (अनुगामी स्थान), ऊँचाई = 131 (शीर्ष रिक्ति) + 200 (ऊँचाई) + 269 (नीचे रिक्ति)

UIScrollView में विचारों के लिए बाधाओं को कैसे जोड़ा जाए:

  1. सामग्री दृश्य में विचारों की स्थिति का इमेजिंग।
  2. सामग्री दृश्य के किनारों पर ऊपर, दाएं, नीचे, बाएं रिक्त स्थान को जोड़ें, इसके अलावा, इन दृश्यों की चौड़ाई और ऊंचाई भी।

और यह सब किया जाता है।

स्क्रोलव्यू के साथ ऑटोलॉयट से निपटने का एक आसान तरीका यह है कि स्क्रॉल व्यू में सभी सबव्यू वाले कंटेनर व्यू जोड़ें।

निष्कर्ष: UIScrollView के साथ AutoLayout को समझने के लिए महत्वपूर्ण बिंदु यह है कि आंतरिक दृश्य सामग्री दृश्य के विरुद्ध बाधाएं बनाते हैं लेकिन UIScrollView स्वयं नहीं।

संलग्न उदाहरण कोड


5

निम्नलिखित समाधान के लिए मेरे लिए काम किया autolayout साथ और contentSize बिना scrollview :

  1. देखने के लिए एक स्क्रॉल दृश्य खींचें n खींचें और आप जो भी जगह चाहते हैं उसे कवर करने के लिए जो भी बाधाएं हैं उन्हें लागू करें।
  2. स्क्रू व्यू के अंदर एक यूआईईवी को ड्रैग करें और इसे स्क्रोल व्यू के पूरे स्पेस को कवर करें और स्क्रैच व्यू से टॉप, लेफ्ट, राइट, बॉटम स्पेस के लिए बाधाएं लागू करें ।
  3. स्क्रॉलिंग की आवश्यकता के अनुसार आंतरिक दृश्य की ऊंचाई (और चौड़ाई यदि क्षैतिज स्क्रॉलिंग की आवश्यकता है) सेट करें । आवश्यकता पड़ने पर यह भाग कोड से भी किया जा सकता है।
  4. गंभीर । जब आप बिंदु (3) में कुछ बड़े मान सेट करते हैं, तो वापस बिंदु (2) पर जाएँ और शीर्ष, बाएँ, दाएँ, नीचे मान शून्य पर वापस सेट करने के लिए निश्चित हो जाएं क्योंकि जब आप बल देते हैं तो Xcode उन्हें आपके लिए बदल सकता है। (3) में ऊँचाई बदल दी।

और आपने कल लिया। अब, आप इस दृश्य पर किसी भी संख्या में नियंत्रण जोड़ सकते हैं और एक दूसरे के लिए प्रासंगिक बाधाओं को लागू कर सकते हैं (जो इस दृश्य के बिना काम नहीं करते हैं)। यदि आप इस दृश्य का उपयोग नहीं करना चाहते हैं तो आपको स्क्रॉलव्यू से संबंधित प्रत्येक नियंत्रण (एक दूसरे से संबंधित नहीं) के लिए अड़चनें लागू करनी होंगी।


भारी टिप ..............

गंभीर । आइए स्पष्टता के लिए कहें कि UIScrollView 1000 चौड़ा और 100 उच्च है। (वास्तव में आमतौर पर ये मूल्य गतिशील होंगे, ज़ाहिर है, डिवाइस की चौड़ाई के आधार पर आदि। लेकिन अभी के लिए केवल 1000 और 100 उच्च कहते हैं।) मान लीजिए कि आप एक क्षैतिज स्क्रॉल कर रहे हैं। इसलिए UIScrollView के अंदर एक UIView लगाएं। (वह "सामग्री दृश्य" है।) स्क्रॉल दृश्य के लिए सामग्री दृश्य के सभी चार अवरोधों को ऊपर, नीचे, अग्रणी, अनुगामी सेट करें। गलत लगने पर भी उन्हें शून्य कर दें। सामग्री UIView की ऊँचाई को 100 पर सेट करें और उसके बारे में भूल जाएँ। अब: आप क्षैतिज रूप से स्क्रॉल करना चाहते हैं, इसलिए सामग्री दृश्य की चौड़ाई को 1225 कहने दें।

ध्यान दें कि सामग्री दृश्य की चौड़ाई अब पैरेंट स्क्रॉल दृश्य की चौड़ाई से 225 बड़ी है। यह ठीक है: वास्तव में, आप ऐसा अवश्य करते हैं। ध्यान दें कि

... आप अनुगामी चौड़ाई को ऋणात्मक 225 पर सेट नहीं करते हैं ...

आपको लगता है कि आपको चौड़ाई को "मैच" करना होगा जैसा कि आप सामान्य रूप से करते हैं । लेकिन अगर आप ऐसा करते हैं, तो यह बिल्कुल भी काम नहीं करेगा।

आपको अग्रणी और अनुगामी संख्या ZERO पर सेट करनी होगी , कभी भी नकारात्मक नहीं (भले ही चौड़ाई "बड़ी" हो)

दिलचस्प है, आप वास्तव में किसी भी सकारात्मक मूल्य के लिए अग्रणी / अनुगामी संख्या निर्धारित कर सकते हैं ("50" कहने का प्रयास करें) और यह आपको उछाल का एक प्रकार देता है। (यह अक्सर बहुत अच्छा लगता है: इसे आज़माएं।) दोनों छोर पर कोई भी नकारात्मक मूल्य "चुपचाप टूट जाएगा"।

ध्यान दें कि, अक्सर, Xcode (वैसे भी 7.3.1),

'मददगार' उन मूल्यों को आपके लिए नकारात्मक संख्याओं में सेट करेगा!

क्योंकि यह स्वचालित रूप से उन्हें आप के लिए मिलान करने की कोशिश करता है। यदि ऐसा है तो यह चुपचाप टूट जाएगा। सभी चार मानों को पहले उदाहरण में शून्य पर सेट करें। और उदाहरण में "1000" की तुलना में बहुत व्यापक सामग्री की चौड़ाई निर्धारित करें।


संपादित: मैंने अपनी अधिकांश आवश्यकता के लिए UIScrollView के बजाय UITableView का उपयोग करके समाप्त किया है। जैसा कि TableView मुझे अधिक लचीला और गतिशील लगता है।


यह वास्तव में यहाँ सबसे अच्छा जवाब है। धन्यवाद!
फेटी

4

मुझे लगता है कि आप के साथ मुद्दों में भाग रहे हैं contentSize। की जाँच करें इस ब्लॉग पोस्ट कैसे संभाल करने पर contentSizeजब एक "शुद्ध" autolayout दृष्टिकोण का उपयोग कर। इसका सार यह है कि आपकी बाधाएं सामग्री के आकार को स्पष्ट रूप से परिभाषित करती हैं। AutoLayout का उपयोग करते समय आप इसे स्पष्ट रूप से सेट करते हैं। मैंने ब्लॉग पोस्ट के अंत में उदाहरण परियोजना संलग्न की है कि यह कैसे काम करता है


3

टेक नोट्स में एक टुकड़ा है जिसे आपने देखा होगा। आप स्क्रॉल दृश्य के किनारों पर तय की गई बाधाओं का उपयोग करके स्क्रॉल दृश्य की सामग्री आकार को स्पष्ट रूप से सेट कर सकते हैं।

यहाँ एक सरल उदाहरण है। एक दृश्य के साथ एक स्टोरीबोर्ड बनाएं, जिसमें एक स्क्रॉल दृश्य है। यह सेट करें कि स्क्रॉल दृश्य अवरोधों को उस दृश्य के आकार के अनुकूल बनाने के लिए करें जिसे आप इसमें डालते हैं।

उस स्क्रॉल दृश्य के अंदर एक एकल दृश्य जोड़ें। स्पष्ट रूप से बाधाओं का उपयोग करके उस दृश्य का आकार निर्धारित करें (और सुनिश्चित करें कि आकार स्क्रॉल दृश्य से बड़ा है)।

अब उस आंतरिक दृश्य में चार और अवरोधों को जोड़कर आंतरिक दृश्य के चार किनारों को उसके मूल स्क्रॉल दृश्य पर लॉक कर दें। उन चार बाधाओं को आंतरिक दृश्य को समायोजित करने के लिए सामग्री के आकार का विस्तार करने का कारण होगा।

यदि आपके पास कई दृश्य हैं जिन्हें आप स्क्रॉल दृश्य में जोड़ना चाहते हैं, उदाहरण के लिए क्षैतिज रूप से निर्धारित किया गया है, तो आप स्क्रॉल दृश्य के बाईं ओर पहले सबव्यू के बाईं ओर लॉक करेंगे, एक-दूसरे को क्षैतिज रूप से और दाईं ओर साक्षात्कार को लॉक करेंगे। स्क्रॉल दृश्य के दाईं ओर अंतिम उप दृश्य का पक्ष। उन बाधाओं को सबव्यू और उनके अवरोधों को समायोजित करने के लिए स्क्रॉल दृश्य की सामग्री के आकार को विस्तारित करने के लिए मजबूर करना होगा।


3

यदि आपका प्रश्न है "मैं UITextFields का एक गुच्छा खड़ी स्क्रॉल UIScrollView में कैसे डालूं, ताकि वे कीबोर्ड के रास्ते से हट जाएं जब उनका ध्यान केंद्रित हो", तो सबसे अच्छा जवाब है:

मत करो।

इसके बजाय स्थैतिक कोशिकाओं के साथ एक UITableViewController का उपयोग करें।

आपको यह स्क्रॉल-आउट-ऑफ-द-वे व्यवहार मुफ्त में मिलता है, और यदि आपके व्यू कंट्रोलर को UINavigationController के अंदर प्रदर्शित किया जाता है, तो सभी सामग्री इनसेट बस कार्य करें।


3

आप इस तरह अपने लेआउट व्यवस्थित करना चाहिए
ViewControllerViewहोता है ScrollView, ScrollViewहोता है ContainerView, ContainerView2 शामिलLabels
यहां छवि विवरण दर्ज करें

फिर अपने ScrollViewस्क्रॉल करने के लिए 3 चरणों का पालन करें

  1. स्थापना ScrollViewपिन (ऊपर / सही / नीचे / छोड़ दिया) के लिएViewControllerView
    • स्थापना ContainerViewपिन (ऊपर / सही / नीचे / छोड़ दिया) के लिएScrollView
    • सेट Horizontally in Container( नहीं है सेट Vertically in Container)
    • Label1पिन ( शीर्ष / दायां / बायां)ContainerView
    • Label1पिन (दाएं / बाएं / नीचे ) से ContainerViewऔर ऊपर तकLabel1

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

यहां डेमो प्रोजेक्ट है

उममीद है कि इससे मदद मिलेगी


1

शुद्ध ऑटोलैयौट दृष्टिकोण खूबसूरती से काम करता है, लेकिन अगर आपको गैर-ऑटोलैयट से पलायन हो रहा है, तो इसे स्थापित करने के लिए काफी दर्द होता है। मैंने इसे अभी कुछ समय किया है और मेरे पास कुछ सामान्य सुझाव हैं:

  • छोटा शुरू करें: भले ही इसका मतलब है कि आपके स्टोरीबोर्ड विचारों को फिर से बनाना, बस कुछ तत्वों के साथ शुरू करें और धीरे-धीरे अपने विचारों का निर्माण करें, यह सुनिश्चित करने के लिए कि कुछ तत्वों को जोड़ने के बाद स्क्रॉल काम करता है।
  • सब कुछ पर TranslatesAutoresizingMaskIntoConstraints को बंद करें: यह हमेशा मेरे लिए बाधा संघर्ष का कारण था।
  • अपने UIScrollView बाधाओं को ठीक से सेट करें: सुनिश्चित करें कि स्क्रॉल दृश्य सभी पक्षों पर मूल दृश्य से जुड़ा हुआ है, अन्यथा यह बस विस्तार नहीं करेगा।

1

इस मुद्दे से निपटने के कुछ समय बाद, मुझे आखिरकार एक समाधान मिला। मैं यूनिवर्सल क्लास साइज स्टोरीबोर्ड (600x600) के साथ काम कर रहा हूं। मैंने स्क्रॉलव्यू के आकार का एक यूआईवीईवाई (कंटेंट व्यू) बनाया और स्क्रॉलव्यू को टॉप, बॉटम, लीडिंग और ट्रेलिंग के लिए अड़चनें पैदा कीं। तब मैंने सामग्री के आकार को मैन्युअल रूप से 600x600 पर क्लिप किया। स्टोरीबोर्ड ने सब कुछ आकार देने की कोशिश करना बंद कर दिया और मैं काम कर सकता था लेकिन दृश्य वास्तविक डिवाइस या सिम्युलेटर पर भयानक लग रहा था। मैंने इस क्लिप किए गए आकारों के 2 बाधा आउटलेट बनाए।

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewWidthConstraint; 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewHeightConstraint;

फिर व्यूडीडलड में

CGSize viewSize = self.view.frame.size;
self.contentViewWidthConstraint.constant = viewSize.width;
self.contentViewHeightConstraint.constant = viewSize.height;

बहुत अच्छा काम करता है।


1

मैंने दिन बिताए कि कैसे ऑटोलेयूट को देखने के लिए एक एम्बेडेड स्क्रूव्यू का उपयोग करने की कोशिश की जाए, जो स्क्रीन में स्क्रॉलव्यू को केंद्रित करने के लिए, सभी डिवाइस / स्क्रीन आयामों के साथ-साथ स्क्रीन रोटेशन के साथ काम करता है।

मैंने केवल ऑटोलैयूट के साथ इसे करने की कोशिश में दिन बिताए, और पास हो गया लेकिन कभी भी पास नहीं हुआ। इसलिए अंत में मुझे व्यू स्क्रीन में कोड की 3 पंक्तियों को स्क्रीन के साथ जोड़ना पड़ा।

नीचे समाधान देखें:

  1. स्क्रोलव्यू बनाएं और इसे अपनी इच्छित वस्तुओं से भरें
  2. ऑटो लेआउट चालू करें
  3. फिर स्क्रॉलव्यू को लंबवत और क्षैतिज रूप से केंद्र करें केंद्र स्क्रॉल दृश्य
  4. दृश्य का चयन करें और फिर 'लापता कमी जोड़ें' - यह तब अपनी बात करता है
  5. इसका परिणाम यह होता है कि बहुत सारी अड़चनें उत्पन्न होती हैं। दृश्य के लिए 2 नए बनाए गए हैं: 'हॉरिज स्पेस स्क्रॉलव्यू टू व्यू' और 'वर्टिकल स्पेस स्क्रॉलव्यू टू व्यू' या इसके विपरीत।
  6. 'Horiz space स्क्रॉलव्यू टू व्यू' को हटा दें ताकि अब आप व्यू पर 3 अवरोधों के साथ बचे रहें। स्क्रॉल में दृश्य में प्रवेश करने के लिए 2 और स्क्रॉलव्यू और दृश्य के बीच एक ऊर्ध्वाधर स्थान निर्धारित करने के लिए
  7. अब क्लिक करके अपने कोड में वर्ट्टी बाधा को लिंक करें और Ctrl को हेडर फाइल पर खींचकर एक NSLayoutConstraint IBOutlet (मैं मेरा कॉन्स्ट्रेविंटवर्ट वीटोएसवी कहा जाता है) बना रहा हूं
  8. अब .m फ़ाइल पर जाएँ और कोड की इन पंक्तियों को viewDidLoad में जोड़ें (सही लंबवत प्राप्त करने के लिए पैडिंग राशि के साथ खेलें)

    if (IPAD)

    {self.constraintVertVtoSV.constant = 150.0; }

  9. यह अब सभी उपकरणों पर चलना चाहिए और ठीक से केंद्रित होना चाहिए और फिर भी ठीक से स्क्रॉल करना चाहिए।


1

अगर मेरी तरह आप सबव्यू के अंदर बिना किसी कॉन्टस्ट्रेन के स्थिर सामग्री का उपयोग करते हैं, तो आप इस तरह कर सकते हैं:

override func viewDidLayoutSubviews() {
    scrollView.contentSize = CGSizeMake(320, 800)
}

1

आईओएस 8.4, एक्सकोड 6.4 के साथ आज भी ऐसी ही समस्या है

स्क्रॉल दृश्य वाला एक दृश्य, जिसमें एक सामग्री दृश्य (UIView) शामिल है, जिसमें साक्षात्कार हैं।

हर जगह सब कुछ ऑटो लेआउट है। स्क्रोलव्यू किनारों को पेरेंट व्यूज किनारों पर बाधाओं के साथ पिन किया गया है। सामग्री दृश्य किनारों को स्क्रॉल दृश्य किनारों पर बाधाओं के साथ पिन किया गया है।

मूल रूप से सामग्री दृश्य स्क्रॉल दृश्य की पूर्ण चौड़ाई के रूप में आकार देने से इंकार कर देगा। मुझे मूल दृश्य स्क्रॉल दृश्य से मेल खाते हुए इसकी चौड़ाई के लिए सामग्री दृश्य पर एक अतिरिक्त अवरोध जोड़ना पड़ा। या मैं एक contentView.centerX == scrollView.centerX बाधा को सेट कर सकता हूं। या तो किनारों को पिन करने के अलावा उनमें से एक ने अचानक सामग्री को ठीक से आकार दिया।

// Either one of these additional constraints are required to get autolayout to correctly layout the contentView. Otherwise contentView size is its minimum required size
scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: .CenterX, relatedBy: .Equal, toItem: scrollView, attribute: .CenterX, multiplier: 1.0, constant: 0))
scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: scrollView, attribute: .Width, multiplier: 1.0, constant: 0.0))

प्रपत्र के दृश्य अवरोधों का उपयोग करके स्क्रॉल दृश्य में सामग्री दृश्य के किनारों को पिन करना,

let cvConstraints = ["H:|[contentView]|", "V:|[contentView]|"]

मैं सरणी के माध्यम से पुनरावृति करने के लिए एक रूटीन का उपयोग करता हूं और उन्हें स्क्रॉलव्यू में जोड़ता हूं।


1

मैंने इसी तरह की समस्या का सामना किया। मैंने हर विवशता को स्थापित किया और हमेशा सोचता रहा कि यह अभी भी कुछ साक्षात्कारों का आकार क्यों बदल रहा है। मेरा समाधान क्लिप सेट करने के लिए था YES के लिए सीमाएँ।


1

में तेजी से आप इस काम कर समाधान का उपयोग कर सकते हैं।

contraints

ScrollView: लीडिंग, ट्रेलिंग, टॉप, बॉटम = सुपरव्यू

ContentView: अग्रणी, अनुगामी, ऊपर, नीचे = स्क्रॉल दृश्य। सामग्री के लिए निर्धारित / सापेक्ष ऊँचाई।

आप चौड़ाई स्क्रॉल (कंटेंट व्यू) को स्क्रॉलव्यू सुपरवाइव के बराबर सेट कर सकते हैं, लेकिन निर्माण समय पर हटाए जाने का चयन करें क्योंकि आप उस बाधा को प्रोग्रामेटिक रूप से जोड़ रहे होंगे। यह सिर्फ इतना है कि आईबी चेतावनी के साथ शिकायत नहीं करता है।

extension UIView {

    func setupContentViewForViewWithScroll(contentView vwContent : UIView) {
        //Set constraint for scrollview content
        let constraint = NSLayoutConstraint(item: vwContent, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: self.bounds.size.width)
        vwContent.addConstraint(constraint)
        self.layoutSubviews()
    }

}

और देखें नियंत्रक में viewDidLayoutSubviewsमैं सिर्फ इस विधि को कॉल करता हूं:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.view.setupContentViewForViewWithScroll(contentView: vwContent)
}

0

मुझे पता है कि यह एक आम आदमी का समाधान है और न कि ऐप्पल ने जो सुझाव दिया है, लेकिन यह मेरे लिए दो बार काम किया है, अलग-अलग सामग्री के साथ और बहुत जल्दी सेट किया जा सकता है: स्टोरीबोर्ड व्यू कंट्रोलर में यूआईवाइवाई डालें। UIView में एक टेबल व्यू, डायनेमिक, 0 प्रोटोटाइप सेल, स्टाइल प्लेन या ग्रुपेड इन्सर्ट करें। तालिका दृश्य में एक स्क्रॉल दृश्य सम्मिलित करें, स्क्रॉल दृश्य सम्मिलित करें सामग्री में। कस्टम दृश्य नियंत्रक में यह कोई सेटिंग्स नहीं है।

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