Kullanılacak doğru API UIView systemLayoutSizeFittingSize:ya UILayoutFittingCompressedSizeya geçiyor UILayoutFittingExpandedSize.
Otomatik UIViewyerleşim kullanan normal bir durum için, bu sadece kısıtlamalarınız doğru olduğu sürece çalışmalıdır. Bir UITableViewCell(örneğin satır yüksekliğini belirlemek için) üzerinde kullanmak istiyorsanız, onu hücrenize karşı çağırmalı contentViewve yüksekliği yakalamalısınız.
Görüşünüzde çok satırlı bir veya daha fazla UILabel varsa, dikkate alınması gereken başka noktalar da vardır. Bunlar için, preferredMaxLayoutWidthözelliğin, etiketin hesaplamada intrinsicContentSizekullanılacak bir doğru sağlayacağı şekilde doğru ayarlanması önemsizdir systemLayoutSizeFittingSize's.
EDIT: istek üzerine, tablo görünümü hücresi için yükseklik hesaplaması örneği ekleme
Tablo hücresi yükseklik hesaplaması için otomatik düzenleme kullanmak süper verimli değildir, ancak özellikle karmaşık bir düzene sahip bir hücreniz varsa, uygun olduğundan emin olun.
Yukarıda söylediğim gibi, çok satırlı bir etiket kullanıyorsanız, etiket genişliğini UILabelsenkronize etmek zorunludur preferredMaxLayoutWidth. Bunu UILabelyapmak için özel bir alt sınıf kullanın:
@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
HeightForRowAtIndexPath'i gösteren, onaylanmış bir UITableViewController alt sınıfı:
#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
Basit bir özel hücre:
#import "TSTableViewCell.h"
#import "TSLabel.h"
@implementation TSTableViewCell
{
IBOutlet TSLabel* _label;
}
- (void) setText: (NSString *) text
{
_label.text = text;
}
@end
Ve burada Storyboard'da tanımlanan kısıtlamaların bir resmi. Etikette yükseklik / genişlik sınırlaması bulunmadığına dikkat edin - bunlar etiketten çıkarılır intrinsicContentSize:
