उप-परीक्षा के बाद गतिशील रूप से ऑटोलैयूट का उपयोग करके पर्यवेक्षणीय आकार बदलें


83

मैं भगवान के प्यार के लिए खिचड़ी भाषा के इस आकार को देख रहा हूँ।

मेरे पास UIView *superview 4 है UILabels। 2 अन्य लोगों के लिए हेडर के रूप में 2 फ़ंक्शन।

सभी 4 की सामग्री गतिशील डेटाबेस से आ रही है।

SizeToFitबनाम SizeThatFits:(CGSize)बनाम UIView systemLayoutSizeFittingSize:, या तो गुजर UILayoutFittingCompressedSizeया UILayoutFittingExpandedSize

मैं प्रोग्राम में ऑटोलैयूट का उपयोग करता हूं और डमी संख्या के बराबर या उससे अधिक होने के लिए सुपरवाइवे की ऊंचाई निर्धारित की है।

कहाँ और कैसे मैं इन का उपयोग करते हैं SizeToFitबनाम sizeThatFits:(CGSize)बनाम UIView systemLayoutSizeFittingSize:, गुजर या तो UILayoutFittingCompressedSizeया UILayoutFittingExpandedSize। मैंने यहाँ ढेर सारी युक्तियों को पढ़ा है, लेकिन कुछ नहीं के साथ समाप्त हुआ।

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

मैं अपने बालों को खरोंच रहा हूँ .. मदद करें


1
अरे, क्या आप अपने कोड को पास्टिबिन या कहीं और पोस्ट कर सकते हैं अगर मैं देख सकता था? मैं एक ऐसी ही समस्या से पीड़ित हूं। एक सप्ताह या उससे अधिक समय हो गया है।
ेश

जवाबों:


104

यदि आप ऑटो लेआउट का उपयोग कर रहे हैं, तो यहां आपको क्या करना है:

  1. सुनिश्चित करें कि आप अपने किसी भी साक्षात्कार के आधार पर निश्चित चौड़ाई और / या ऊँचाई की बाधाओं को नहीं जोड़ रहे हैं (इस पर निर्भर करता है कि आप किस आयाम (आकार) को गतिशील रूप से आकार देना चाहते हैं)। विचार यह है कि प्रत्येक सबव्यू के आंतरिक सामग्री के आकार को सबव्यू की ऊंचाई निर्धारित करने दें। UILabels 4 स्वचालित निहित बाधाओं के साथ आता है, जो सभी पाठ के अंदर फिट करने के लिए आवश्यक सटीक आकार पर लेबल के फ्रेम को रखने की कोशिश करेंगे (आवश्यक प्राथमिकता से कम के साथ)।

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

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

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


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

मैं समाधान से सहमत हूं, लेकिन यह मेरे लिए काम नहीं कर रहा है, stackoverflow.com/questions/34635838/…
Omer

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

1
यह उल्लेख किया जाना चाहिए कि translatesAutoresizingMaskIntoConstraints = NOयदि आप xib का उपयोग कर रहे हैं तो आपको सेट करना चाहिए ।
KudoCC

TranslatesAutoresizingMaskIntoConstraints = NO मेरे मामले का उत्तर है। लेकिन अब कंटेनर दृश्य खो गया है और इसका मूल हमेशा (0,0) है, मैं इसे उस जगह पर रख सकता हूं जहां मैं चाहता हूं। stackoverflow.com/questions/45548372/…
करीम

24

कंटेनर दृश्य का उपयोग करें

निम्नलिखित उदाहरण में मेरे पास 30x30 की छवि है, और UILabelप्लेसहोल्डर पाठ के साथ युक्त दृश्य से छोटा है। मुझे कम से कम छवि के रूप में बड़ा होने के लिए युक्त दृश्य की आवश्यकता थी, लेकिन बहु-पंक्ति पाठ को बढ़ाने के लिए इसे बढ़ने की आवश्यकता थी।

दृश्य प्रारूप में आंतरिक कंटेनर इस तरह दिखता है:

H:|-(15.0)-[image(30.0)]-(15.0)-[label]-(15.0)-|
V:|[image(30.0)]|
V:|[label(>=30.0)]|

फिर, लेबल की ऊंचाई से मिलान करने के लिए युक्त दृश्य सेट करें। अब युक्त दृश्य लेबल के आकार की सवारी करेगा।

जैसा कि @smileyborg ने अपने उत्तर में बताया है, सामग्री को पर्यवेक्षण से जोड़कर लेआउट इंजन को सूचित करता है कि साधारण कंटेनर दृश्य को बढ़ने का कारण बनना चाहिए।

पीला संरेखण आयतें

यदि आप चाहते हैं कि पीले संरेखण आयतें -UIViewShowAlignmentRects YESआपकी योजना की रन तर्कों की सूची में शामिल हों।

UILabel जो मल्टी-लाइन है


12
-UIViewShowAlignmentRects YES- महान टिप!
राल्फोंसो

2
इस मामले में, कंटेनर को केवल लेबल की ऊँचाई को अनुकूलित करना होगा। क्या होगा यदि कंटेनर को एक से अधिक दृश्य की ऊंचाइयों के योग के अनुकूल होना चाहिए?
दा रोचा पाइरेसी

7

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

view.setNeedsUpdateConstraints()
view.updateConstraintsIfNeeded()
view.setNeedsLayout()
view.layoutIfNeeded()

अपनी सामग्री बदलने के बाद। तब आप कॉल करके अपना नया आकार प्राप्त कर सकते हैं

view.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)

यदि आपको कभी किसी दृश्य के लिए आवश्यक सटीक आकार की गणना करने की आवश्यकता है।


2
मैं StackView का उपयोग कर रहा हूं और विचारों को गतिशील रूप से जोड़ रहा हूं, इन विचारों का आकार परिवर्तन नहीं हो रहा है। @ याकूबथु
मनसु ....

6

यह लगभग @smileyborg उत्तर का अनुसरण करता है और एक ठोस उदाहरण के साथ आता है।

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

सभी बाधाओं का वर्णन नहीं किया जाएगा, लेकिन यूआई वस्तुओं की ऊंचाई की गणना से संबंधित हैं।

  1. [लेबल] लेबल में एक निश्चित heightबाधा नहीं होनी चाहिए , इस मामले में, AutoLayout पाठ को फिट करने के लिए लेबल का आकार नहीं बदलेगा, इसलिए किनारे की बाधाओं को सेट करना महत्वपूर्ण है। (हरे तीर)
  2. [सबव्यू] चरण 1 और 3 का पालन करना बहुत आसान है, लेकिन यह कदम गलत समझा जा सकता है। जैसा कि लेबल के मामले में, साक्षात्कार में heightबाधा नहीं होनी चाहिए । सभी उपबंधों में topबाधा निर्धारित होना चाहिए, बाधा की अनदेखी bottom, जो आपको लगता है कि रनटाइम पर असंतुष्ट बाधा अपवाद को ट्रिगर करेगा, लेकिन यदि आप bottomपिछले उप- समूह के लिए बाधा निर्धारित नहीं करेंगे । ऐसा करने के लिए लापता लेआउट को उड़ा देगा। (रेड एरोज़)

  3. [सुपरव्यू] सभी तरह की बाधाओं को सेट करें जो आपको आवश्यक है, लेकिन heightबाधा पर बड़ा ध्यान दें । इसे एक यादृच्छिक मान निर्दिष्ट करें, लेकिन इसे वैकल्पिक बनाएं, ऑटोलेयूट सबव्यू में फिट होने के लिए ऊंचाई निर्धारित करेगा। (नीले तीर)

यह पूरी तरह से काम करता है, किसी भी अतिरिक्त सिस्टम-लेआउट अपडेट विधियों को कॉल करने की आवश्यकता नहीं है।


कैसे एक वैकल्पिक ऊंचाई बनाने के लिए .. मैं iOS के लिए नया हूँ तो यह समझ से बाहर नहीं होगा। धन्यवाद
फैसल नसीर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.