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




swift autolayout (16)

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

इसलिए, जब भी मेरे पास दृश्य पदानुक्रम होता है तो मैं परेशानी में पड़ता हूं:

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

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

समस्या तब शुरू होती है जब मैं UILabel में पिछली बाधा डालता हूं:

उदाहरण के लिए, पीछे की ओर स्थान: सुपरव्यू बराबर: 25

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

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

बी) गलत स्थान (लेबल अपेक्षित: x = -67 वास्तविक: x = 207

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

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

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

ओबी-वान केनोबी मेरी मदद करो! संदिग्ध लेआउट क्यों? गलत जगह क्यों?

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


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

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


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


[एक्सकोड 7.2 में और आईओएस 9.2 के लिए परीक्षण]

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

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

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

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


अगर कोई ऐसा व्यवहार कर रहा है जहां आप दाएं स्क्रॉल पर स्क्रॉल बार देखते हैं लेकिन सामग्री नहीं बढ़ती है, तो यह तथ्य शायद इस पर विचार करने लायक है:

स्क्रॉल व्यू के बाहर स्क्रॉल व्यू की सामग्री और ऑब्जेक्ट्स के बीच स्क्रॉल व्यू के बाहर एक निश्चित स्थिति प्रदान करने के लिए आप स्क्रॉल व्यू पर फ़्लोट करने के लिए दिखाई दे सकते हैं।

यह ऐप्पल के documentation । उदाहरण के लिए, यदि आपने गलती से सामग्री के बजाय स्क्रॉल क्षेत्र (शायद एक हेडर या स्क्रॉल व्यू के ऊपर कुछ भी) के बाहर देखने के लिए अपने शीर्ष लेबल / बटन / आईएमजी / दृश्य को पिन किया है, तो आप अपनी पूरी सामग्री को स्थिर कर देंगे।


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

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


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


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

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

मेरे मामले में अंतिम दृश्य लाइनों की संपत्ति के साथ UILable था = 0 (जो इसकी सामग्री के आधार पर स्वचालित रूप से अपनी ऊंचाई समायोजित करता है) ताकि यह गतिशील रूप से उबलने की ऊंचाई बढ़ा सके और अंततः हमारे स्क्रोल करने योग्य क्षेत्र में वृद्धि हो क्योंकि यूइलबल के नीचे लेआउट की वजह से हमारे सामग्री दृश्य के नीचे गठबंधन किया गया है, जो इसकी सामग्री ऑफ़सेट बढ़ाने के लिए स्क्रॉलव्यू को मजबूर करता है।


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

  1. UIScrollView अंदर एक UIView जोड़ें (हम उस contentView को कॉल कर सकते हैं contentView );

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

समाप्त

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

अद्यतन करें:

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


मुझे एक ही त्रुटि मिल रही थी .. मैंने निम्नलिखित किया है

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

अब scrollView (2) के लिए अग्रणी / पीछे / शीर्ष / नीचे जोड़ें UIView (3)।

देखें (1) और देखें (3) समान ऊंचाई और वजन सेट करें .. यह मेरी समस्या हल हो गया।

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

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


मुझे एक ही समस्या थी और दस्तावेज़ीकरण के माध्यम से खोज करने और स्वीकार्य समाधान नहीं ढूंढने के बाद। जैसा कि नीचे वर्णित है, आपको UIScrollView के सबव्यूव के रूप में एक UIView बनाने की आवश्यकता है:

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

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

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

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

ऊपर की बाधाओं के साथ जारी रखें, और मुख्य दृश्य के संबंध में अपने कंटेनर व्यू में बाधाओं को " समान ऊंचाई " और " समान चौड़ाई " जोड़ें और अपने UIScrollView पर नहीं। दूसरे शब्दों में कंटेनर व्यू की बाधाएं UIScrollView के पर्यवेक्षण से बंधी हुई हैं।

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

मुझे उम्मीद है इससे किसी को सहायता मिलेगी।


मुझे लगता है कि यह अब से 10 सेकंड का काम है। मैंने इसे एक्सकोड 7.3 में देखा और उस पर एक वीडियो बनाया। यहा जांचिये:

https://www.youtube.com/watch?v=yETZKqdaPiI

आपको बस इतना करना है, उसी चौड़ाई और ऊंचाई के साथ UIScrollView एक सबव्यू जोड़ें। फिर ViewController का चयन Reset to suggested constraint दबाएं। स्पष्ट समझ के लिए कृपया वीडियो जांचें।

धन्यवाद


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


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

निम्नलिखित दो बाधाएं मेरी समस्या का समाधान करती हैं:

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

जिसमें: पीछे, नीचे पीछे हैं, UIScrollView के नीचे


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

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

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

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


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

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


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





interface-builder