Kullanılacak doğru API UIView systemLayoutSizeFittingSize:
ya UILayoutFittingCompressedSize
ya geçiyor UILayoutFittingExpandedSize
.
Otomatik UIView
yerleş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ı contentView
ve 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 intrinsicContentSize
kullanı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 UILabel
senkronize etmek zorunludur preferredMaxLayoutWidth
. Bunu UILabel
yapmak 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
: