उपयोग करने के लिए सही एपीआई या UIView systemLayoutSizeFittingSize:
तो गुजर रहा है UILayoutFittingCompressedSize
या UILayoutFittingExpandedSize
।
UIView
ऑटोलेयूट का उपयोग करते हुए एक सामान्य के लिए यह तब तक काम करना चाहिए जब तक कि आपके अवरोध सही न हों। यदि आप इसे UITableViewCell
(उदाहरण के लिए पंक्ति ऊंचाई निर्धारित करने के लिए) पर उपयोग करना चाहते हैं, तो आपको इसे अपने सेल के खिलाफ कॉल करना चाहिए contentView
और ऊंचाई को पकड़ना चाहिए।
आगे के विचार मौजूद हैं यदि आपके पास एक या एक से अधिक यूलैबेल हैं जो आपके विचार में बहुस्तरीय हैं। इसके लिए यह आवश्यक है कि preferredMaxLayoutWidth
संपत्ति को सही ढंग से सेट किया जाए ताकि लेबल एक सही प्रदान करे intrinsicContentSize
, जिसका उपयोग systemLayoutSizeFittingSize's
गणना में किया जाएगा ।
संपादित करें: अनुरोध द्वारा, तालिका दृश्य सेल के लिए ऊंचाई गणना का उदाहरण जोड़कर
टेबल-सेल ऊंचाई गणना के लिए ऑटोलाययूट का उपयोग करना सुपर कुशल नहीं है, लेकिन यह सुनिश्चित करना सुविधाजनक है, खासकर यदि आपके पास एक सेल है जिसमें एक जटिल लेआउट है।
जैसा कि मैंने ऊपर कहा, यदि आप एक बहुस्तरीय का उपयोग कर रहे हैं तो UILabel
यह preferredMaxLayoutWidth
लेबल की चौड़ाई के साथ सिंक करने के लिए जरूरी है । मैं ऐसा करने के लिए एक कस्टम UILabel
उपवर्ग का उपयोग करता हूं :
@implementation TSLabel
- (void) layoutSubviews
{
[super layoutSubviews];
if ( self.numberOfLines == 0 )
{
if ( self.preferredMaxLayoutWidth != self.frame.size.width )
{
self.preferredMaxLayoutWidth = self.frame.size.width;
[self setNeedsUpdateConstraints];
}
}
}
- (CGSize) intrinsicContentSize
{
CGSize s = [super intrinsicContentSize];
if ( self.numberOfLines == 0 )
{
// found out that sometimes intrinsicContentSize is 1pt too short!
s.height += 1;
}
return s;
}
@end
यहां एक UITableViewController उपक्लास का प्रदर्शन किया गया है जो ऊँचाई का प्रदर्शन करता है RowAtIndexPath:
#import "TSTableViewController.h"
#import "TSTableViewCell.h"
@implementation TSTableViewController
- (NSString*) cellText
{
return @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
}
#pragma mark - Table view data source
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView
{
return 1;
}
- (NSInteger) tableView: (UITableView *)tableView numberOfRowsInSection: (NSInteger) section
{
return 1;
}
- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath
{
static TSTableViewCell *sizingCell;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sizingCell = (TSTableViewCell*)[tableView dequeueReusableCellWithIdentifier: @"TSTableViewCell"];
});
// configure the cell
sizingCell.text = self.cellText;
// force layout
[sizingCell setNeedsLayout];
[sizingCell layoutIfNeeded];
// get the fitting size
CGSize s = [sizingCell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize];
NSLog( @"fittingSize: %@", NSStringFromCGSize( s ));
return s.height;
}
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
TSTableViewCell *cell = (TSTableViewCell*)[tableView dequeueReusableCellWithIdentifier: @"TSTableViewCell" ];
cell.text = self.cellText;
return cell;
}
@end
एक साधारण कस्टम सेल:
#import "TSTableViewCell.h"
#import "TSLabel.h"
@implementation TSTableViewCell
{
IBOutlet TSLabel* _label;
}
- (void) setText: (NSString *) text
{
_label.text = text;
}
@end
और, यहाँ स्टोरीबोर्ड में परिभाषित बाधाओं की एक तस्वीर है। ध्यान दें कि लेबल पर कोई ऊँचाई / चौड़ाई की कमी नहीं है - वे लेबल से अनुमानित हैं intrinsicContentSize
: