2014-09-26 12 views
15

के लिए ऑटो लेआउट के साथ गतिशील ऊंचाई वाले दो UILabels तो मैं ऑटो लेआउट के साथ गतिशील ऊंचाई आकार स्थापित करने में सक्षम हूं जब मेरे पास केवल एक लेबल है जो लंबाई के आधार पर ऊंचाई को बदलता है डोर। मेरी समस्या यह है कि यदि मैं एक और UILabel जोड़ता हूं जो ऐसा करना चाहिए, तो चीजें काम नहीं करतीं।आईओएस 7/8 यूआईटीबल व्यू सेल: परिवर्तनीय पंक्ति ऊंचाई

मैं दोनों सामग्री गले लगाना प्राथमिकता है और दोनों के लिए 1000 के लिए संपीड़न प्रतिरोध == अगर मैं तो यह 999 या 250 से पीछे नहीं UILabel के लिए सामग्री गले (कार्यक्षेत्र) सेट मैं अस्पष्टता

की चेतावनी मिल की स्थापना कर रहा हूँ महान काम करता है लेकिन केवल तभी जब दूसरे लेबल में 2 या अधिक रेखा होती है। यदि दूसरा लेबल खाली है या केवल एक पंक्ति है, तो heightForRowAtIndexPath सिस्टम LayoutSizeFittingSize: UILayoutFittingCompressed आकार ऊंचाई बड़े मान देता है, और कोशिकाओं में बड़ी रिक्त स्थान होती है।

मैंने आंतरिक आकार के साथ भी खेला: डिफ़ॉल्ट या प्लेसहोल्डर (कुछ ऊंचाइयों और चौड़ाई के साथ) लेकिन यह या तो मदद नहीं करता है।

कोई भी सुझाव क्या किया जा सकता है?

उत्तर

18

मुझे अंततः यह काम मिल गया। समाधान मेरे लिए मौजूदा फ्रेम चौड़ाई में पसंदीदा चौड़ाई को स्पष्ट रूप से सेट करना था। मूल रूप से लेबल में स्पष्ट चेक मार्क की जांच> आकार निरीक्षक में पसंदीदा चौड़ाई।

रेफरी: http://www.raywenderlich.com/73602/dynamic-table-view-cell-height-auto-layout नमूना कोड डाउनलोड करें और स्टोरीबोर्ड सेटअप देखें।

+0

तो एक निश्चित चौड़ाई का आपका UILabel था? –

+0

नहीं, मैं विभिन्न डिवाइस आकारों का समर्थन करता हूं, इसलिए चौड़ाई उस पर आधारित होती है। – Zsolt

+2

मेरे लिए, गायब तत्व रे वेंडरलिच ट्यूटोरियल में दिखाए गए अनुसार मेरे सेल के शीर्षक और उपशीर्षक लेबल दोनों के लिए सामग्री हगिंग और सामग्री संपीड़न प्रतिरोध प्राथमिकता सेट कर रहा था। – Daniel

0

मेरे लिए सामग्री को हॉगिंग प्राथमिकता और सामग्री संपीड़न प्रतिरोध प्राथमिकता को प्राथमिकता के अनुसार काम करने वाले तत्व में से एक को कम करने के लिए सेट करना।

1

मेरे लिए यह कई चीजों का संयोजन ले गया।

  • सामग्री गले और प्रतिरोध सही स्थापित करने के अलावा
  • मैं लेबल
  • की preferredMaxLayoutWidth संभालने के लिए और साथ ही intrinsicContentSize में एक बग को सही

को UILabel का एक उपवर्ग करना था UILabel सबक्लास इस तरह दिख रहा है:

@implementation LabelDynamicHeight 

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    self.preferredMaxLayoutWidth = self.frame.size.width; 

    [super layoutSubviews]; 
} 

- (void)setBounds:(CGRect)bounds 
{ 
    [super setBounds:bounds]; 

    if (self.numberOfLines == 0) 
    { 
     CGFloat boundsWidth = CGRectGetWidth(bounds); 
     if (self.preferredMaxLayoutWidth != boundsWidth) 
     { 
      self.preferredMaxLayoutWidth = boundsWidth; 
      [self setNeedsUpdateConstraints]; 
     } 
    } 
} 

- (CGSize)intrinsicContentSize 
{ 
    CGSize size = [super intrinsicContentSize]; 

    if (self.numberOfLines == 0) 
    { 
     // There's a bug where intrinsic content size may be 1 point too short 
     size.height += 1; 
    } 

    return size; 
} 

@end 

Beside यह कॉलिंग लेआउट tableView heightForRowAtIndexPath: में ऊंचाई प्राप्त करने से पहले सेल पर अनुमानित सामग्री सामग्री पर systemLayoutSizeFittingSize: विधि का उपयोग करने से पहले बाधाओं को तैयार करने के लिए तैयार किया गया है। इस तरह देख रहे हैं:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = ...; 
    CGFloat height = cell.frame.size.height; 
    if (cell.dynamicHeight) 
    { 
     // https://stackoverflow.com/a/26351692/1840269 
     [cell layoutIfNeeded]; 
     height = cell.frame.size.height; 

     CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 
     if (size.height > height) 
      height = size.height; 
    } 
    return height; 
} 

संदर्भ: https://www.objc.io/issues/3-views/advanced-auto-layout-toolbox/

  • intrinsicContentSize ठीक साथ UILabel उपवर्ग के लिए प्रेरणा: https://stackoverflow.com/a/16281229/1840269
  • preferredMaxLayoutWidth हेरफेर के विवरण:

  • +0

    यह काम नहीं करता !!! –

    संबंधित मुद्दे