사용할 올바른 API UIView systemLayoutSizeFittingSize:
는 UILayoutFittingCompressedSize
또는을 (를 ) 전달하는 것 UILayoutFittingExpandedSize
입니다.
UIView
자동 레이아웃을 사용 하는 일반적인 경우 제약 조건이 올바른 한 작동해야합니다. UITableViewCell
예를 들어 행 높이를 결정 하기 위해 그것을 사용하려면 셀에 대해 호출 contentView
하고 높이를 가져와야합니다.
하나 이상의 UILabel이 뷰에 여러 줄인 경우 추가 고려 사항이 있습니다. 이러한 경우 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
다음은 heightForRowAtIndexPath를 보여주는 고안된 UITableViewController 하위 클래스입니다.
#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
.