UIScrollView स्क्रॉल करने योग्य सामग्री का आकार अस्पष्टता


510

साथी देवता, मुझे इंटरफ़ेस बिल्डर (Xcode 5 / iOS 7) में ऑटोलेयआउट से परेशानी हो रही है। यह बहुत बुनियादी और महत्वपूर्ण है इसलिए मुझे लगता है कि हर किसी को पता होना चाहिए कि यह कैसे ठीक से काम करता है। यदि यह Xcode में बग है, तो यह एक महत्वपूर्ण है!

इसलिए, जब भी मुझे कोई पदानुक्रम दिखाई देता है जैसे कि मैं मुसीबत में भागता हूं:

>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)

UIScrollView में ठोस अड़चनें हैं, जैसे, हर तरफ से 50 px (कोई समस्या नहीं)। फिर मैं यूबेलब (कोई समस्या नहीं) में एक शीर्ष स्थान की बाधा जोड़ता हूं (और मैं लेबल की ऊंचाई / चौड़ाई को पिन भी कर सकता हूं, कुछ भी नहीं बदल सकता है, लेकिन लेबल के आंतरिक आकार के कारण अनावश्यक होना चाहिए)

मुसीबत तब शुरू होती है, जब मैं यूबिल के लिए एक कठिन बाधा जोड़ता हूं:

जैसे, अनुगामी स्थान: सुपरविले बराबर: २५

अब दो चेतावनियाँ होती हैं - और मुझे समझ नहीं आता कि:

A) स्क्रॉल करने योग्य सामग्री का आकार अस्पष्टता (स्क्रॉल दृश्य में अस्पष्ट स्क्रॉल करने योग्य सामग्री ऊंचाई / चौड़ाई है)

बी) गलत दृश्य (लेबल अपेक्षित: x = -67 वास्तविक: x = 207

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

कृपया ध्यान दें: यदि आप UIScrollView को UIView से बदलते हैं, तो व्यवहार अपेक्षित है (लेबल का फ्रेम सही है और बाधा के अनुसार)। तो ऐसा लगता है कि या तो UIScrollView के साथ एक मुद्दा हो सकता है या मुझे कुछ महत्वपूर्ण याद आ रहा है।

जब मैं IB द्वारा सुझाए गए लेबल के फ्रेम को अपडेट किए बिना ऐप को चलाता हूं, तो यह ठीक है, ठीक उसी स्थान पर जहां यह होना चाहिए था और UIScrollView स्क्रॉल करने योग्य है। यदि मैं फ़्रेम को अपडेट करता हूं तो लेबल दृष्टि से बाहर है और UIScrollView स्क्रॉल नहीं करता है।

मेरी मदद करें ओबी-वान केनोबी! अस्पष्ट लेआउट क्यों? गलत दृष्टिकोण क्यों?

आप यहाँ नमूना परियोजना को डाउनलोड कर सकते हैं और कोशिश कर सकते हैं कि क्या पता चल सके: https://github.com/Wirsing84/AutoLayoutProblem

इंटरफ़ेस बिल्डर में समस्या का चित्रण


8
सामग्री में दृश्य में UILabel रखने का प्रयास करें, फिर लेबल के अनुगामी किनारे को सामग्री दृश्य (नियमित UIView) पर सेट करें। यह वीडियो आपकी बहुत मदद कर सकता है: youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be
erdekhayser

1
शानदार वीडियो, लेकिन इसने मेरे लिए चेतावनी तय नहीं की। :(
श्री रोजर्स

वीडियो के लिए बहुत बहुत धन्यवाद - वहाँ (बल्कि आश्चर्यजनक रूप से) काफी कुछ मैंने इससे सीखा था! हालाँकि, जब मैं वीडियो के ज्ञान को stackoverflow.com/questions/18953617/… के साथ संयोजित करता हूँ, तो मैं चेतावनी को ठीक कर सकता हूँ। जो प्रश्न शेष है, वह यह है कि स्क्रॉलव्यू के कंटेंटव्यू आकार को केवल आवश्यकतानुसार बड़ा कैसे बनाया जाए?
विर्सजन

इस वीडियो को देखिए । यह दिखाता है कि XCode 5 / iOS 7 के साथ UIScrollLayout और autolayout का उपयोग कैसे करें।
20-13 को jaxvy

मेरा सुझाव UIScrollViewसीधे उपयोग नहीं है। इसके बजाय UICollectionViewया UITableViewजितना संभव हो उपयोग करें , ज्यादातर हर चीज इन तत्व के साथ संभव है और इसकी सादगी, पठनीयता और पुन: प्रयोज्यता भी प्रदान करती है !!!
SPatel

जवाबों:


1093

तो मैं इस तरह से हल किया:

  1. UIScrollView ऐड के अंदर a UIView(हम कॉल कर सकते हैं contentView);

  2. इसमें contentView, सेट टॉप, बॉटम, लेफ्ट और राइट मार्जिन 0 (निश्चित रूप से scrollViewजिसमें से है superView); केंद्र भी क्षैतिज और लंबवत संरेखित करें ;

समाप्त हो गया

अब आप कि में अपने सभी विचारों में जोड़ सकते हैं contentView, और contentSizeके scrollViewलिए स्वचालित रूप से साथ अनुसार बदल दिया जाएगा contentView

अपडेट करें:

कुछ विशेष मामला नीचे दिए गए टिप्पणियों में @Sergio द्वारा पोस्ट किए गए इस वीडियो द्वारा कवर किया गया है ।


33
लगभग सही है, सिवाय इसके कि स्क्रॉलव्यू अब आपकी सामग्री की लंबाई का अनुमान नहीं लगा सकता है और इसके अनुसार आकार बदलने के लिए ऑब्जेक्ट्स को अंदर फिट करने के लिए इसे आकार दें। मेरे पास contentView के अंदर एक टेबलव्यू है, जिसकी ऊँचाई (बाधा के माध्यम से) बदल जाती है और स्क्रॉलव्यू मुझे स्क्रॉल करने की अनुमति नहीं देता है।
साइबरमेव

28
हो सकता है कि यह वीडियो शेष सभी मुद्दों को दूर करने में मदद करे।
सर्जियो

46
यह नहीं है कि यह स्क्रॉल था।
डोरियन

2
@MatteoGobbi यही था! यह किया चाल! स्क्रॉलव्यू की इस तरह की समस्याओं से जूझ रहा था 2 दिनों के लिए ऑटो लाइक पागलपन .... थैंक यू यू !!!
पोलो 987

55
स्क्रॉलव्यू के साथ समस्या का सामना करने वाले किसी भी व्यक्ति के लिए स्क्रॉल करने योग्य नहीं होने के कारण, कंटेंट व्यू के नीचे और कम प्राथमिकता वाले लंबवत अवरोधों को संरेखित करने के लिए मेरे साथ चाल चली!
jimmy0251

98

यह त्रुटि मुझे ट्रैक करने में थोड़ी देर लगी, शुरू में मैंने स्क्रॉलव्यू के आकार को पिन करने की कोशिश की, लेकिन त्रुटि संदेश स्पष्ट रूप से "सामग्री का आकार" कहता है। मैंने यह सुनिश्चित कर लिया है कि स्क्रॉलव्यू के शीर्ष से मैंने जो कुछ भी पिन किया था, उसे नीचे तक पिन किया गया था। इस तरह से स्क्रॉलव्यू सभी वस्तुओं और बाधाओं की ऊंचाई का पता लगाकर इसकी सामग्री ऊंचाई की गणना कर सकता है। इसने अस्पष्ट सामग्री की ऊँचाई को हल कर दिया, चौड़ाई बहुत समान है ... शुरू में मेरे पास ज्यादातर चीजें थीं जो स्क्रॉलव्यू में केंद्रित थीं, लेकिन मुझे स्क्रॉलव्यू के पक्ष में वस्तुओं को भी पिन करना पड़ा। मुझे यह पसंद नहीं है क्योंकि iPhone6 ​​में एक व्यापक स्क्रीन हो सकती है लेकिन यह 'अस्पष्ट सामग्री की चौड़ाई' त्रुटि को हटा देगा।


31
आपके उत्तर के लिए धन्यवाद! अगर मैं आपको सही ढंग से समझता हूं कि आप स्क्रॉलव्यू में प्रत्येक और सबव्यू को ऊपर और नीचे पिन करके त्रुटि को दूर करने के लिए प्राप्त करते हैं। हालाँकि, यह आवश्यक नहीं है। आपको बस यह सुनिश्चित करना है कि स्क्रॉलव्यू के ऊपर से नीचे तक लगातार बाधाओं को बनाने का एक तरीका है। [-XXX] मुझे आशा है कि यह समझ में आ रहा था;>
विरस

1
यदि दृश्य में परिवर्तनशील हाईट है तो समस्या को कैसे ठीक करें? मैं बाधाओं को कैसे सेट करूं ताकि स्क्रॉलव्यू आकार की गणना कर सके?
हैशियर

2
'आपको बस यह सुनिश्चित करना है कि स्क्रोलव्यू के ऊपर से नीचे तक लगातार बाधाओं की एक सतत रेखा बनाने का एक तरीका है' <- उस वाक्य के लिए धन्यवाद
एडम वेट

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

2
यदि आप अपने फोन की स्क्रीन की चौड़ाई या अपने यूआई में किसी अन्य तत्व की तरह स्क्रॉलव्यू की चौड़ाई का पालन करना चाहते हैं (जैसे कि यूआईवाईवाईवाई) तो आपको उस दूसरे तत्व का उपयोग करके उस पर "समान चौड़ाई" सेट करने की आवश्यकता है जो माप के लिए स्क्रॉलव्यू के बाहर है।
डिपार्टमेंट एंट्रेंस बी

88

Xcode 11+

उपयोग करने का सबसे सरल तरीका autolayout:

  1. पर्यवेक्षण (या अपने इच्छित आकार) में जोड़ें UIScrollViewऔर पिन 0,0,0,0करें
  2. UIViewस्क्रॉलव्यू में जोड़ें , इसे 0,0,0,0सभी 4 पक्षों पर पिन करें और इसे केंद्र करें horizontallyऔर vertically
  3. आकार निरीक्षक में, परिवर्तन bottomऔर align center Yप्राथमिकता 250 तक। (क्षैतिज स्क्रॉल परिवर्तन के लिए ) trailingऔरalign center X
  4. वे सभी दृश्य जोड़ें, जिनकी आपको इस दृश्य में आवश्यकता है। सबसे कम दृश्य पर नीचे की बाधा निर्धारित करने के लिए मत भूलना
  5. चयन UIScrollViewकरें, आकार निरीक्षक का चयन करें और अचयनित करें Content Layout Guides

1
मैं स्क्रॉलव्यू की सामग्री ऊंचाई सेट करने में असमर्थ था, लेकिन यह काम करता है। :)
ब्लाइंड निंजा

2
संकेत: मेरे द्वारा यह केवल काम किया है, अगर मैंने केंद्र को क्षैतिज और लंबवत रूप से हटा दिया और इसे समान चौड़ाई (स्क्रॉलव्यू + व्यू स्क्रॉलव्यू के अंदर देखें) के साथ हटा दिया और सामग्री के आधार पर ऊंचाई जोड़ रहा है, जिसका अर्थ है कि दृश्य के अंतिम तत्व को नीचे की आवश्यकता है। अधिक जानकारी के लिए यहां देखें: stackoverflow.com/a/54577278/5056173
शॉन 15

1
शॉन, मैं इसे हर दिन शाब्दिक रूप से उपयोग कर रहा हूं और ऊर्ध्वाधर और क्षैतिज स्क्रॉलव्यू स्क्रॉल की बात आने पर मुझे इस दृष्टिकोण से कभी कोई समस्या नहीं हुई। हो सकता है कि आप सबसे निचले / अंतिम तत्व पर नीचे की बाधा डालना भूल गए हों। उसके बिना, यह काम नहीं करेगा।
Đorđe Nilović

7
बिंदु संख्या 4 - दूसरा वाक्य बड़ा है।
नीतीश

2
इस जवाब ने मेरे लिए पूरी तरह से काम किया
satvinder singh

63

यह मेरे स्व-उत्तर वाले प्रश्न के लिए उत्तर है UIScrollView + केंद्रित दृश्य + अस्पष्ट स्क्रॉल सामग्री आकार + कई iPhone आकार

लेकिन यह पूरी तरह से आपके मामले को भी कवर करता है!

तो, यहाँ सरल स्थिति के लिए प्रारंभिक स्थिति है:

  1. सभी किनारों पर 0 बाधाओं के साथ स्क्रॉल दृश्य
  2. बटन स्थिर चौड़ाई और ऊंचाई की बाधाओं के साथ क्षैतिज और ऊर्ध्वाधर केंद्रित है
  3. और, निश्चित रूप से - कष्टप्रद चेतावनी Has ambiguous scrollable content width और Has ambiguous scrollable content height

1

सब, जो हमें करना है:

  • हमारे दृश्य के लिए अनुगामी और / या नीचे स्थान के लिए "0" उदाहरण के लिए 2 अतिरिक्त बाधाओं को जोड़ें, (नीचे स्क्रीनशॉट पर उदाहरण देखें)।

महत्वपूर्ण: आपको अनुगामी और / या नीचे की बाधाओं को जोड़ना होगा । "अग्रणी और शीर्ष" नहीं - यह काम नहीं करता है!

2

आप इसे मेरे उदाहरण प्रोजेक्ट में देख सकते हैं , जो यह दर्शाता है कि इस समस्या को कैसे ठीक किया जाए।

पुनश्च

तर्क के अनुसार - इस क्रिया को "परस्पर विरोधी बाधाओं" का कारण बनना चाहिए। लेकिन नहीं!

मुझे नहीं पता कि यह क्यों काम करता है और कैसे Xcode पता लगाता है कि कौन सी बाधा अधिक प्राथमिकता है (क्योंकि मैं इन बाधाओं की खोज के लिए प्राथमिकता निर्धारित नहीं कर रहा हूं)। मैं आभारी हूँ अगर कोई समझाता है, तो नीचे टिप्पणियों में क्यों काम करता है।


महान टिप! मैं नीचे के किनारे पर एक बाधा पैदा कर रहा हूं और मध्यम या निम्न प्राथमिकता निर्धारित करता हूं
डीन

वाह! यह गंभीरता से कोई मतलब नहीं है लेकिन काम करता है! धन्यवाद! मेरे विचार में अंतिम आइटम मेरे पास 0 का निचला अवरोधक, और BANG है। अंत में काम किया।
जैकब हविद 14

60

Xcode 11+, स्विफ्ट 5

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

सामग्री दृश्य किनारों (अग्रणी, अनुगामी, ऊपर, नीचे) को छवि पर अग्रणी की तरह पिन नहीं किया जाना चाहिए - फ़्रेम लेआउट गाइड के लिए

इस तरह नहीं

लेकिन इस तरह - कंटेंट लेआउट गाइड के लिए।

ड्रॉपडाउन से कंटेंट लेआउट गाइड का चयन करें

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

और फिर अधिकांश उत्तर आपके लिए काम करेंगे।

अब सबसे सरल तरीका इस प्रकार है:

  1. मूल दृश्य में स्क्रॉल दृश्य रखें
  2. स्क्रॉल दृश्य के सभी पक्षों को पर्यवेक्षण के लिए पिन करें
  3. एक और UIView (इसे सामग्री दृश्य कहेंगे) लें और इसे स्क्रॉल दृश्य के अंदर रखें
  4. सामग्री के सभी पक्षों को दृश्य के सामग्री लेआउट गाइड को स्क्रॉल करने के लिए पिन करें
  5. कंटेंट व्यू की चौड़ाई को स्क्रॉल व्यू फ्रेम गाइड के बराबर रखें
  6. किसी भी तरह से आप चाहते हैं कि सामग्री की ऊंचाई को ठीक करें (मैंने नीचे दिए उदाहरण में सिर्फ निरंतर ऊंचाई की कमी का इस्तेमाल किया है)

कुल मिलाकर सरलतम कार्यान्वयन में आपकी संरचना इस तरह दिखाई देगी

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


@AntToKnow ऊंचाई के लिए बाधा लेने की जरूरत नहीं है, बस अपनी प्राथमिकता कम (250) में बदल दें
रेकनर

Xcode 11+, स्विफ्ट 5. @WantToKnow उत्तर के अनुसार, मैंने अपना मुद्दा हल किया, मैंने [वीडियो] [1] और [कोड] [2] [1]: youtube.com/watch?v=qMrH5_YjjhM [2] तैयार किया: github.com/AhmAbdallah/CustomCollectionView
अहमद अब्दुल्ला

1
यह एक शानदार जवाब है, धन्यवाद।
कांस्टेंटाइन

1
यह सही जवाब है। धन्यवाद।
विन्सेंट जॉय

यह मेरे लिए तभी काम किया जब मैंने सामग्री दृश्य के अंतिम तत्व में नीचे की बाधा जोड़ी
D.Zotov

49

आपको नीचे वर्णित UIViewके UIScrollViewरूप में एक उप के रूप में बनाने की आवश्यकता है :

  • UIViewController
  • UIView 'प्रमुख राय'
    • UIScrollView
      • UIView 'कंटेनर दृश्य'
        • [आपकी सामग्री]

दूसरा कदम UIScrollViewअड़चनें बनाना है । मैंने इसके शीर्ष, नीचे, अग्रणी और इसकी सुपर व्यू के लिए बाधाओं को पीछे छोड़ते हुए ऐसा किया।

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

"अस्पष्ट स्क्रॉल योग्य सामग्री चौड़ाई है" और "अस्पष्ट स्क्रॉल करने योग्य सामग्री ऊंचाई है"

ऊपर एक ही बाधाओं के साथ जारी रखें, और बस की कमी को जोड़ने Equal Heightऔर Equal Widthअपने को कंटेनर देखें के संबंध में मुख्य दृश्य और के लिए नहीं अपने UIScrollView। दूसरे शब्दों में कंटेनर व्यू की बाधाएं UIScrollViewसुपरवाइज से बंधी हैं ।

उसके बाद आपको अपने स्टोरीबोर्ड में चेतावनी नहीं होगी और आप अपने साक्षात्कारों के लिए बाधाओं को जोड़ना जारी रख सकते हैं।


2
सहमत - मुझे लगता है कि एक कंटेनर दृश्य जोड़ना सबसे अच्छा, सबसे अधिक रखरखाव योग्य समाधान है।
एंड्रयू एबलिंग

1
यह समाधान तब काम करेगा जब आपके पास प्रबंधन करने के लिए नेविगेशन बार नहीं होगा।
लीना

25

मेरी भी यही समस्या थी। इस चेकबॉक्स को अनटिक करें। चूंकि आप सामग्री का आकार कोड में सेट कर रहे हैं। यहाँ छवि विवरण दर्ज करें


24

मैं अंत में यह पता लगा, मुझे आशा है कि यह समझना आसान है।

आप अक्सर "कंटेंट व्यू" के रूप में स्क्रॉल आधार पर UIView को जोड़कर उस चेतावनी को बाईपास कर सकते हैं, जैसा कि उन्होंने उल्लेख किया है और इसे अपने स्क्रॉल दृश्य के समान आकार दें और इस सामग्री दृश्य पर, इन 6 मापदंडों को सेट करें।

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

जैसा कि आप देख सकते हैं, आपको 6 कुल मापदंडों की आवश्यकता है! जो .. सामान्य परिस्थितियों में, आप 2 बाधाओं की नकल कर रहे हैं, लेकिन इस स्टोरीबोर्ड त्रुटि से बचने का तरीका है।


1
ऊपर लगभग मेरे लिए काम किया, क्योंकि मैं 3 अलग-अलग स्क्रीन चौड़ाई (4/5, 6, 6+) के बारे में चिंतित हूं, मैंने सामग्री दृश्य सेट किया है और समान चौड़ाई वाले स्क्रॉल दृश्य देखें। आप सही हैं, यह एक डुप्लिकेट है जैसा कि मैंने पहले ही बताया था कि कंटेंट व्यू में 0 लीडिंग और एंडिंग स्पेस है।
स्टुअर्ट पी।

8
आप कंटेंट व्यू से लेकर समसामयिक मूल्यों के बजाय स्क्रॉल करने के लिए कंटेंट व्यू से बराबर चौड़ाई और ऊंचाई की बाधाएं सेट कर सकते हैं। यह सभी प्रस्तावों पर काम करेगा।
कुमार सी।

मुझे समान लागू करना है, तो क्या आप मेरी मदद कर सकते हैं कि मुझे सामग्री दृश्य और स्क्रॉल दृश्य दोनों के लिए समान ऊंचाई और चौड़ाई निर्धारित करनी है?
उर्मि

यह देखने के लायक हो सकता है कि क्या आपको अभी भी ऐसा करना है। मैंने हाल ही में एक स्क्रॉलव्यू में एक ImageView सेट किया और Xcode 8.3 में त्रुटि को गायब करने के लिए शीर्ष पर दिखाए गए केवल 4 अवरोधों को सेट करने के साथ दूर जाने में सक्षम था
विलियम टी।

1
@ यह 3 साल पहले पोस्ट किया गया था। तब से उन्होंने निश्चित रूप से स्टोरीबोर्ड में सुधार किया है। मैंने भी ध्यान दिया कि आप अब कंटेंट व्यू के बिना दूर हो सकते हैं। मैं अपना उत्तर समायोजित करूंगा।
विलियम टी।

16

मुझे पता है कि मुझे देर हो सकती है, लेकिन अगला समाधान अतिरिक्त कोड के बिना इस तरह की समस्याओं को हल करता है , बस स्टोरीबोर्ड का उपयोग करना:

अपने कंटेंट दृश्य के लिए आपको स्क्रॉल करने के लिए अग्रणी / अनुगामी / टॉप / बॉटम स्पेस के लिए अड़चनें सेट करने की आवश्यकता है और इससे कंटेंट व्यू फ्रेम नहीं बदलेगा :यहाँ छवि विवरण दर्ज करें

बेशक आपको कंटेंट व्यू के लिए अतिरिक्त अड़चनें बनाने की जरूरत है ताकि स्क्रॉल व्यू कंटेंट साइज को जान सके। उदाहरण के लिए निर्धारित ऊंचाई और केंद्र x निर्धारित करें।

उम्मीद है की यह मदद करेगा।


7

मेरे लिए contentViewसुझाव के अनुसार काम नहीं किया। इसके अलावा, यह अतिरिक्त दृश्य के कारण ओवरहेड बनाता है (हालांकि मैं इसे एक बड़ी समस्या नहीं मानता)। क्या मेरे लिए सबसे अच्छा काम किया बस के लिए गया था अस्पष्टता-जाँच बंद कर देते हैं मेरे लिए scrollView। सब कुछ अच्छी तरह से बाहर है तो मुझे लगता है कि यह मेरे जैसे सरल मामलों में ठीक है। लेकिन ध्यान रखें, यदि आपके scrollViewब्रेक के लिए अन्य बाधाएं हैं , तो इंटरफ़ेस-बिल्डर आपको इसके बारे में कोई चेतावनी नहीं देगा ।

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


5
यह सिर्फ चेतावनी को हटा देगा और समस्या को हल करने के लिए कुछ नहीं करेगा।
प्रेड्रैग मनोज्लोविक

आप। कर रहे हैं। मेरे। नायक। यह अस्तित्व में नहीं था और इसे पाकर प्रसन्न था! मैंने "केवल स्थिति सत्यापित करें" की कोशिश की, जिसकी आपको अपेक्षा होगी, मुझे नहीं पता, केवल स्थिति को सत्यापित करें लेकिन यह इस छोटी सी "सामग्री के आकार" के मुद्दे को भी अनुमति नहीं देता है। "कभी सत्यापित न करें" के साथ जाना होगा। धन्यवाद!
डस्टिन

मुझे लगता है कि यह सही उत्तर है यदि आप बच्चे को प्रोग्रामेटिक रूप से देख रहे हैं। धन्यवाद!
फ्लोरियन कुश

6

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

http://samwize.com/2014/03/14/how-to-use-uiscrollview-with-autolayout/


3

नीचे देखें: स्क्रॉलव्यू ऊर्ध्वाधर और क्षैतिज केंद्रीकृत में सामग्री दृश्य। आपको अस्पष्टता त्रुटि मिली, हमेशा सुनिश्चित करें कि दो को स्क्रॉलव्यू में जोड़ा गया है आपके सामग्री दृश्य से 1) है। लेकिन बॉटम स्पेस टू कंटेनर। 2) स्ट्रींग स्पेस टू कॉन्स्ट्रेण्ट जो कि स्क्रीनशॉट में हाइलाइट किया गया है।

स्क्रॉल में इन बाधाओं का अर्थ है कि आप अपनी सामग्री की ऊंचाई या चौड़ाई के बाद कितना स्क्रॉल कर सकते हैं।

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

यह आपकी मदद कर सकता है।


3

मैंने चयनित दृश्य के लिए "हल ऑटो लेआउट मुद्दों"> "लापता बाधाओं को जोड़ें" का उपयोग करके अपने दृश्य के लिए इस तरह की समस्या को हल किया यहाँ छवि विवरण दर्ज करें

निम्नलिखित दो अड़चनें मेरी समस्या का समाधान करती हैं:

trailing = Stack View.trailing - 10
bottom = Stack View.bottom + 76

जिसमें: अनुगामी, नीचे अनुगामी हैं, नीचे UIScrollView हैं


इसने मेरे लिए "नीचे से नीचे" बाधा को जोड़कर काम किया। अब जब मैं इसके बारे में सोचता हूं तो यह सही समझ में आता है।
सिल्वरवॉल्फ - मोनिका

3

ContentView (का उपयोग करते हुए UViewकंटेनर के अंदर के रूप में) UIScrollView, किनारों को छड़ी ( top, bottom, trailing, leading) superview की ( UIScrollView) और contentViewहोना चाहिए equalwidthऔर equalheightsuperview करने के लिए। वे अड़चन हैं। और विधि की कॉल:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.contentView.frame.size;
}

मेरे लिए मुद्दों को हल किया।


3

स्विफ्ट 4+ दृष्टिकोण:

1) UIScrollView को 0 से ऊपर, नीचे, बाएं और दाएं मार्जिन पर सेट करें

2) UIScrollView के अंदर एक UIView और सेट टॉप, बॉटम, लीडिंग, ट्रेलिंग मार्जिन 0 से (UIScrollView मार्जिन के बराबर)।

3) सबसे महत्वपूर्ण हिस्सा चौड़ाई और ऊंचाई निर्धारित करना है , जहां ऊंचाई की बाधा कम प्राथमिकता होनी चाहिए

private func setupConstraints() {

    // Constraints for scrollView
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

    // Constraints for containerView
    containerView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    containerView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    containerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    containerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
    containerView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

    let heightConstraint = containerView.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
    heightConstraint.priority = UILayoutPriority(rawValue: 250)
    heightConstraint.isActive = true
}

2

@ मट्टो गोब्बी का जवाब एकदम सही है, लेकिन मेरे मामले में, स्क्रोलव्यू स्क्रॉल नहीं कर सकता, मैं " एलायंस सेंटर वाई " को हटा देता हूं और " ऊंचाई> = 1 " जोड़ देता हूं, स्क्रोलव्यू स्क्रॉल योग्य हो जाएगा


2

जो लोग uiscrollview से नहीं जूझ रहे हैं, वे आपके अंतिम दृश्य के निचले लेआउट (जो आपके सामग्री दृश्य के अंदर है) के साथ सिर्फ आपके कन्टैंट व्यू के निचले अवरोध को स्क्रॉल नहीं कर रहे हैं। केंद्र Y बाधा को दूर करने के लिए मत भूलना।

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

मेरे मामले में अंतिम दृश्य कोई भी लाइनेबल प्रॉपर्टी नहीं थी। कौन सी सामग्री स्क्रॉल को बढ़ाने के लिए स्क्रॉलव्यू को बाध्य करता है।


2

मैंने youTube पर एक वीडियो बनाया
Xcode में केवल Storyboard का उपयोग करके youTube स्क्रॉल StackViews

मुझे लगता है कि 2 तरह के परिदृश्य यहां दिखाई दे सकते हैं।

स्क्रोल व्यू के अंदर का दृश्य -

  1. कोई आंतरिक सामग्री नहीं है आकार (जैसे UIView)
  2. इसकी अपनी आंतरिक सामग्री का आकार है (उदाहरण के लिए UIStackView)

दोनों मामलों में लंबवत स्क्रॉल करने योग्य दृश्य के लिए आपको इन बाधाओं को जोड़ने की आवश्यकता है:

  1. ऊपर, बाएं, नीचे और दाएं से 4 की कमी।

  2. स्क्रॉलव्यू के बराबर चौड़ाई (क्षैतिज रूप से स्क्रॉलिंग रोकने के लिए)

आपको उन विचारों के लिए किसी अन्य बाधा की आवश्यकता नहीं है जिनकी अपनी आंतरिक सामग्री ऊंचाई है।

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


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

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


2
import UIKit

class ViewController: UIViewController {

    //
    let scrollView: UIScrollView = {

        let sv = UIScrollView()
        sv.translatesAutoresizingMaskIntoConstraints = false
        return sv
    }()

    let lipsumLbl: UILabel = { // you can use here any of your subview

        let lbl = UILabel()
        lbl.translatesAutoresizingMaskIntoConstraints = false
        lbl.text = """
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eleifend nisi sit amet mi aliquet, ut efficitur risus pellentesque. Phasellus nulla justo, scelerisque ut libero id, aliquet ullamcorper lectus. Integer id iaculis nibh. Duis feugiat mi vitae magna tincidunt, vitae consequat dui tempor. Donec blandit urna nec urna volutpat, sit amet sagittis massa fringilla. Pellentesque luctus erat nec dui luctus, sed maximus urna fermentum. Nullam purus nibh, cursus vel ex nec, pulvinar lobortis leo. Proin ac libero rhoncus, bibendum lorem sed, congue sapien. Donec commodo, est non mollis malesuada, nisi massa tempus ipsum, a varius quam lorem vitae nunc.

        Cras scelerisque nisi dolor, in gravida ex ornare a. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas vitae nisl id erat sollicitudin accumsan sit amet viverra sapien. Etiam scelerisque vulputate ante. Donec magna nibh, pharetra sed pretium ac, feugiat sit amet mi. Vestibulum in ipsum vitae dui vehicula pulvinar eget ut lectus. Fusce sagittis a elit ac elementum. Fusce iaculis nunc odio, at fermentum dolor varius et. Suspendisse consectetur congue massa non gravida. Sed id elit vitae nulla aliquam euismod. Pellentesque accumsan risus dolor, eu cursus nibh semper id.

        Vestibulum vel tortor tellus. Suspendisse potenti. Pellentesque id sapien eu augue placerat dictum. Fusce tempus ligula at diam lacinia congue in ut metus. Maecenas volutpat tellus in tellus maximus imperdiet. Integer dignissim condimentum lorem, id luctus nisi maximus at. Nulla pretium, est sit amet mollis eleifend, tellus nulla viverra dolor, ac feugiat massa risus a lectus. Pellentesque ut pulvinar urna, blandit gravida ipsum. Nullam volutpat arcu nec fringilla auctor. Integer egestas enim commodo, faucibus neque ac, rutrum magna. Vivamus tincidunt rutrum auctor. Cras at rutrum felis. Fusce elementum lorem ut pharetra venenatis.
        """
        lbl.textColor = .darkGray
        lbl.font = UIFont.systemFont(ofSize: 16)
        lbl.numberOfLines = 0
        return lbl
    }()

    //======================================================================//
    //
    // MARK:- viewDidLoad
    //
    override func viewDidLoad() {
        super.viewDidLoad()

        setupViews()
        setupAutoLayout()
    }

    func setupViews() {

        title = "ScrollView Demo"
        view.backgroundColor = .white
        view.addSubview(scrollView)
        scrollView.addSubview(lipsumLbl)
    }

    func setupAutoLayout() {

        scrollView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        scrollView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

        lipsumLbl.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
        lipsumLbl.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
        lipsumLbl.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        lipsumLbl.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        lipsumLbl.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    }
}

आउटपुट:

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


जब आपको पहले से ही छोड़ दिया है तो आपको अग्रणी की आवश्यकता क्यों है?
ShadeToD

इस उद्देश्य के लिए बाक़ी एंकर का उपयोग नहीं किया जा सकता है, इसलिए हम अग्रणी का उपयोग करने के लिए उपयोग कर रहे हैं।
iAj

आपने अपने उदाहरण में दोनों का उपयोग किया।
ShadeToD

@ शादातो मुझे जांचने दें
iAj

2

मेरे मामले में मुझे आईपैड में गलत सामग्री के आकार और सामग्री के आकार की अस्पष्टता का मुद्दा मिला, लेकिन आईफोन के मामले में काम कर रहा था। मैंने समस्या को हल करने के लिए स्टोरीबोर्ड में निम्नलिखित बदलाव किए हैं।

  1. UIView में स्क्रॉलव्यू जोड़ें और लीडिंग, टॉप, ट्रेलिंग और बॉटम को 0,0,0,0 में जोड़ें।
  2. उदाहरण के लिए आवश्यकताओं के अनुसार स्क्रॉल दृश्य की ऊँचाई निर्धारित करें। 100।
  3. स्क्रॉल देखने के लिए UIView जोड़ें और 0,0,0,0 और संरेखित केंद्र (X) और केंद्र (Y) की बाधाओं के लिए अग्रणी, शीर्ष, अनुगामी और नीचे जोड़ दें।
  4. स्क्रॉल दृश्य के आकार निरीक्षक में "सामग्री लेआउट मार्गदर्शिकाएँ" का चयन रद्द करें।

1

वर्टिकल स्क्रॉलिंग

  1. पर्यवेक्षण के लिए 0,0,0,0 बाधाओं के साथ एक UIScrollView जोड़ें।
  2. स्क्रॉल दृश्य में एक UIView जोड़ें, पर्यवेक्षण के लिए 0,0,0,0 की कमी के साथ।
  3. UIVcrollView के लिए UIView के लिए समान चौड़ाई की बाधा जोड़ें।
  4. उइवे को ऊंचाई जोड़ें।
  5. UIView के लिए बाधाओं के साथ तत्वों को जोड़ें।
  6. नीचे से निकटतम तत्व के लिए, सुनिश्चित करें कि इसमें UIView के नीचे एक बाधा है।

0

जैसा कि मैंने किया था एक अलग सामग्री दृश्य यहाँ दिखाया गया है।

कन्टैंट व्यू फ़्रीफ़ॉर्म है और इसमें कंटेंट व्यू के संबंध में अपने स्वयं के अवरोधों के साथ सभी साक्षात्कार जोड़े जा सकते हैं।

UIScrollView को मुख्य दृश्य नियंत्रक में जोड़ा जाता है।

प्रोग्रामेटिक रूप से मैं सामग्री जोड़ें जो IBOutlet के माध्यम से क्लास से जुड़ा हुआ है और UIScrollView की सामग्री दृश्य सेट करता है।

इंटरफ़ेस बिल्डर के माध्यम से ContentView के साथ UIScrollView


0

मुझे वही त्रुटि मिल रही थी .. जिसका मैंने अनुसरण किया है

  1. देखें (Superview)
  2. स्क्रोलव्यू 0,0,600,600
  3. स्क्रॉल के अंदर UIView: 0,0,600,600
  4. UIView में छवि दृश्य, लेबल शामिल हैं

अब स्क्रॉलिंग व्यू के लिए अग्रणी / अनुगामी / टॉप / बॉटम जोड़ें (2) फिर UIView (3)।

दृश्य (1) और दृश्य (3) का चयन समान रूप से ऊँचाई और वजन के साथ करें।

मैंने वीडियो किया है जो मदद करेगा:

https://www.youtube.com/watch?v=s-CPN3xZS1A


0

[XCode 7.2 और iOS 9.2 के लिए परीक्षण किया गया]

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

इसलिए, मुझे लगता है कि हम इसे स्थापित करके गलत नहीं हैं।

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

स्टोरीबोर्ड चेतावनी मुझे पागल कर रही थी और मैं केवल चेतावनी को दबाने के लिए क्षैतिज या लंबवत रूप से चीजों को केंद्र में नहीं रखना चाहता था।


0

यदि किसी को ऐसा व्यवहार मिल रहा है, जहां आप स्क्रॉल स्क्रॉल बार को दाईं ओर स्क्रॉल करते हैं, लेकिन सामग्री चलती नहीं है, तो यह तथ्य संभवतः विचार करने योग्य है:

आप स्क्रॉल दृश्य की सामग्री के लिए एक निश्चित स्थान प्रदान करने के लिए स्क्रॉल दृश्य के बाहर स्क्रॉल दृश्य की सामग्री और वस्तुओं के बीच बाधाओं का भी उपयोग कर सकते हैं, जिससे सामग्री स्क्रॉल दृश्य पर तैरने लगती है।

यह Apple के प्रलेखन से है । उदाहरण के लिए, यदि आपने गलती से अपने शीर्ष लेबल / बटन / Img / View को स्क्रॉल क्षेत्र से बाहर का दृश्य देखा है (हो सकता है कि सामग्री दृश्य के बजाय एक शीर्ष लेख या स्क्रॉल दृश्य के ठीक ऊपर?), तो आप अपना संपूर्ण सामग्री दृश्य जगह में फ्रीज कर देंगे।


0

जैसा कि पिछले उत्तरों में बताया गया है, आपको स्क्रॉल दृश्य के अंदर एक कस्टम दृश्य जोड़ना चाहिए:

कस्टम दृश्य छवि में चिह्नित ContentView है

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

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

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


0

आपको बस यह सुनिश्चित करना है कि स्क्रॉलव्यू के ऊपर से नीचे तक लगातार बाधाओं को बनाने का एक तरीका है। [-Xxx]

मेरे मामले में - एक क्षैतिज रूप से स्क्रॉल स्क्रॉल दृश्य - मुझे स्क्रॉल दृश्य के प्रत्येक बच्चे के लिए चौड़ाई और ऊंचाई की बाधाओं को जोड़ने की भी आवश्यकता थी, हालांकि एप्पल के तकनीकी नोट आपको यह नहीं बताते हैं।


0

इंटरफ़ेस बिल्डर में साइज़ इंस्पेक्टर में फ्रीफॉर्म के लिए व्यूकंट्रोलर (UIScrollView को पकड़े हुए) आकार सेट करें और सभी को काम करना चाहिए।

UIViewcontroller युक्त इंटरफेस बिल्डर में आकार निरीक्षक में फ्रीफॉर्म सेटिंग


0

यदि आपको अभी भी UIScrollView की समस्या है, तो बस सामग्री लेआउट मार्गदर्शिकाएँ बंद करें (xcode इंटरफ़ेस बिल्डर में अपना स्क्रॉल दृश्य चुनें -> दाएं पैनल में आकार निरीक्षक चुनें -> 'सामग्री लेआउट मार्गदर्शिकाएँ रद्द करें') या इन चरणों का प्रयास करें: xcode 11 स्क्रॉल दृश्य लेआउट - यह लेआउट की नई शैली के लिए उपयोगी हो सकता है। 05.02.2020 के लिए macOS 10.15.2, Xcode 11.3.1 पर ठीक काम करता है

स्क्रीनशॉट देखें


0

ऑटोलाययूट का उपयोग करना

अपने स्क्रॉल दृश्य को अच्छी तरह से परिभाषित दृश्य के अंदर जोड़ें और फिर स्क्रॉल दृश्य के अंदर स्टैक दृश्य जोड़ें

स्क्रॉल व्यू और स्टैक व्यू से टॉप, लेफ्ट, राइट, बॉटम, सेंटर एक्स और सेंटर वाई की बाधाओं को अपने संबंधित सुपर व्यू में जोड़ें

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

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