ios - NSLayoutConstraint "UIView-Encapsulated-Layout-height" क्या है और इसे साफ तरीके से पुन: गणना करने के लिए मजबूर करने के लिए मुझे कैसे जाना चाहिए?




uitableview autolayout (8)

999 पर अपने _collapsedtextHeightConstraint की प्राथमिकता को कम करने का प्रयास करें। इस तरह से सिस्टम ने UIView-Encapsulated-Layout-Height _collapsedtextHeightConstraint बाधा प्रदान की है हमेशा प्राथमिकता लेती है।

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

मेरे पास आईओएस 8 के तहत एक UITableView चल रहा है और मैं एक स्टोरीबोर्ड में बाधाओं से स्वत: सेल ऊंचाई का उपयोग कर रहा हूं।

मेरी कोशिकाओं में से एक में एक एकल UITextView और मुझे इसे उपयोगकर्ता इनपुट के आधार पर अनुबंध और विस्तार करने की आवश्यकता है - पाठ को संक्षिप्त / विस्तारित करने के लिए टैप करें।

मैं पाठ दृश्य में रनटाइम बाधा जोड़कर और उपयोगकर्ता घटनाओं के जवाब में बाधा पर लगातार बदलकर ऐसा कर रहा हूं:

-(void)collapse:(BOOL)collapse; {

    _collapsed = collapse;

    if(collapse)
            [_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
        else
            [_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];

    [self setNeedsUpdateConstraints];

}

जब भी मैं ऐसा करता हूं, मैं इसे तालिका में लपेटता हूं अद्यतन देखें और कॉल करें [tableView setNeedsUpdateConstraints] :

[tableView beginUpdates];

[_briefCell collapse:!_showFullBriefText];

[tableView setNeedsUpdateConstraints];
// I have also tried 
// [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
// with exactly the same results.

[tableView endUpdates];

जब मैं ऐसा करता हूं, तो मेरा सेल विस्तार करता है (और इसे करने के दौरान एनिमेट करता है) लेकिन मुझे बाधाओं की चेतावनी मिलती है:

2014-07-31 13:29:51.792 OneFlatEarth[5505:730175] Unable to simultaneously satisfy constraints.

Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

(

    "<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>",

    "<NSLayoutConstraint:0x7f94dced2260 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...']-(15)-|   (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",

    "<NSLayoutConstraint:0x7f94dced2350 V:|-(6)-[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...']   (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",

    "<NSLayoutConstraint:0x7f94dced6480 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f94de5773a0(91)]>"



 )

Will attempt to recover by breaking constraint 

<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>

388 मेरी गणना की गई ऊंचाई है, UITextView पर अन्य बाधाएं एक्सकोड / आईबी से हैं।

अंतिम एक मुझे परेशान कर रहा है - मुझे लगता है कि UIView-Encapsulated-Layout-Height height सेल की गणना की गई ऊंचाई है जब इसे पहली बार प्रस्तुत किया जाता है - (मैंने अपनी UITextView ऊंचाई> = 70.0 सेट की है) हालांकि ऐसा प्रतीत नहीं होता है सही है कि यह व्युत्पन्न बाधा तब एक अद्यतन उपयोगकर्ता cnstraint overrules।

इससे भी बदतर, हालांकि लेआउट कोड कहता है कि यह मेरी ऊंचाई की बाधा को तोड़ने की कोशिश कर रहा है, ऐसा नहीं होता - यह सेल की ऊंचाई को फिर से समझने के लिए चला जाता है और जैसा कि मैं चाहता हूं सब कुछ खींचता है।

तो, NSLayoutConstraint UIView-Encapsulated-Layout-Height NSLayoutConstraint क्या है (मुझे लगता है कि यह स्वचालित सेल आकार के लिए गणना की गई ऊंचाई है) और मुझे साफ-सफाई के लिए इसे मजबूर करने के लिए मजबूर होना चाहिए?


TableView प्रतिनिधि से इंडेक्सपाथ पर सेल के लिए ऊंचाई प्राप्त करें। फिर cellForRowAtIndexPath से सेल प्राप्त cellForRowAtIndexPath :

top ([email protected])
    cell
bottom ([email protected])

यदि cell.contentView.height: 0 // <-> (UIView-Encapsulated-Layout-Height: 0 @ 1000) शीर्ष (10 @ 1000) के साथ विवादित (UIView-Encapsulated-layout-Height: 0 @ 1000),

क्योंकि उनकी प्राथमिकताएं बराबर 1000 हैं। हमें UIView-Encapsulated-Layout-Height की प्राथमिकता के तहत शीर्ष प्राथमिकता सेट करने की आवश्यकता है।


अपनी सामग्री को फिट करने के लिए टेक्स्ट व्यू का आकार बदलना, और परिणामस्वरूप ऊंचाई पर स्थिरता स्थिरता को अद्यतन करना, मेरे लिए UIView-Encapsulated-Layout-Height height बाधा संघर्ष को ठीक करना, उदाहरण के लिए:

[self.textView sizeToFit];
self.textViewHeightConstraint.constant = self.textView.frame.size.height;

इस view.translatesAutoresizingMaskIntoConstraints = NO; सेट करें view.translatesAutoresizingMaskIntoConstraints = NO; इस मुद्दे को हल करना चाहिए।


एक अन्य संभावना:

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

- (CGFloat)calculateHeightForConfiguredSizingCell:(UITableViewCell *)sizingCell {
   [sizingCell setNeedsLayout];
   [sizingCell layoutIfNeeded];
   CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
   return size.height; // should + 1 here if my uitableviewseparatorstyle is not none

}

जैसा कि Jesse ने प्रश्न की टिप्पणी में उल्लेख किया है, यह मेरे लिए काम करता है:

self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;

एफवाईआई, यह मुद्दा आईओएस 10 में नहीं होता है।


मेरे पास एक समान परिदृश्य है: एक पंक्ति कक्ष के साथ एक तालिका दृश्य, जिसमें UILabel वस्तुओं की कुछ पंक्तियां हैं। मैं आईओएस 8 और ऑटोलाउट का उपयोग कर रहा हूं।

जब मैंने घुमाया तो मुझे गलत सिस्टम की गणना पंक्ति ऊंचाई मिली (43.5 वास्तविक ऊंचाई से बहुत कम है)। ऐसा लग रहा है:

"<NSLayoutConstraint:0x7bc2b2c0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7bc37f30(43.5)]>"

यह सिर्फ एक चेतावनी नहीं है। मेरे टेबल व्यू सेल का लेआउट भयानक है - सभी टेक्स्ट एक टेक्स्ट लाइन पर ओवरलैप किए गए हैं।

यह मुझे आश्चर्यचकित करता है कि निम्न पंक्ति मेरी समस्या को "ठीक" करती है (ऑटोलायआउट कुछ भी शिकायत नहीं करता है और मुझे स्क्रीन पर जो भी उम्मीद है वह मिलता है):

myTableView.estimatedRowHeight = 2.0; // any number but 2.0 is the smallest one that works

इस लाइन के साथ या बिना:

myTableView.rowHeight = UITableViewAutomaticDimension; // by itself this line only doesn't help fix my specific problem

मैं बाधाओं में से किसी एक मूल्य पर priority निर्दिष्ट करके चेतावनी प्राप्त करने में सक्षम था चेतावनी संदेश कहता है कि इसे तोड़ना था (नीचे "Will attempt to recover by breaking constraint" )। ऐसा प्रतीत होता है कि जब तक मैं 49 से अधिक की प्राथमिकता निर्धारित करता हूं, चेतावनी दूर हो जाती है।

मेरे लिए यह मेरा बाधा बदलना था चेतावनी ने कहा कि यह तोड़ने का प्रयास किया:

@"V:|[contentLabel]-[quoteeLabel]|"

सेवा मेरे:

@"V:|[email protected][contentLabel]-[quoteeLabel]|"

वास्तव में, मैं उस बाधा के किसी भी तत्व को प्राथमिकता जोड़ सकता हूं और यह काम करेगा। यह कोई फर्क नहीं पड़ता कि कौन सा। मेरी कोशिकाएं उचित ऊंचाई को समाप्त करती हैं और चेतावनी प्रदर्शित नहीं होती है। रोजर, आपके उदाहरण के लिए, 388 ऊंचाई मूल्य बाधा के बाद @500 सही जोड़ने का प्रयास करें (उदाहरण के लिए [email protected] )।

मुझे पूरी तरह से यकीन नहीं है कि यह क्यों काम करता है लेकिन मैंने थोड़ा जांच की है। NSLayoutPriority enum में , ऐसा प्रतीत होता है कि NSLayoutPriorityFittingSizeCompression प्राथमिकता स्तर 50 । उस प्राथमिकता स्तर के लिए दस्तावेज कहता है:

जब आप किसी दृश्य में एक फिटिंग आकार संदेश भेजते हैं, तो दृश्य की सामग्री के लिए पर्याप्त आकार का सबसे छोटा आकार गणना की जाती है। यह प्राथमिकता स्तर है जिसके साथ दृश्य उस गणना में जितना संभव हो उतना छोटा होना चाहता है। यह काफी कम है। यह वास्तव में इस प्राथमिकता पर बाधा उत्पन्न करने के लिए उचित नहीं है। आप उच्च या निम्न होना चाहते हैं।

संदर्भित fittingSize संदेश के लिए documentation पढ़ता है:

दृश्य का न्यूनतम आकार जो बाधाओं को पूरा करता है। (सिफ़ पढ़िये)

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

मैंने उससे परे खोद नहीं लिया है, लेकिन ऐसा लगता है कि समस्या के झूठ बोलने के साथ इसका कुछ संबंध है।