我在桌面视图单元格上使用Masonry,现在我有一个UITableViewCell,它是一个视图容器,如下所示:
*表视图(cellForRowAtIndexPath):
MasonryTestTableViewCell *masonryCell = [tableView dequeueReusableCellWithIdentifier:@"masonryCell"];
if (masonryCell == nil) {
masonryCell = [[MasonryTestTableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"masonryCell"];
}
[masonryCell addSubview:[self createViewForCell]];
return masonryCell;
* createViewForCell方法(也使用砌体):
-(UIView *) createViewForCell{
self.textLabel = [[UILabel alloc]init];
[self.textLabel setLineBreakMode:NSLineBreakByWordWrapping];
[self.textLabel setTextAlignment:NSTextAlignmentLeft];
[self.textLabel setNumberOfLines:0];
[self.textLabel setText:@"TEST TEXT"];
[self.textLabel setPreferredMaxLayoutWidth:[UIScreen mainScreen].bounds.size.width];
[self addSubview:self.textLabel];
[self.textLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).with.offset(10);
make.bottom.equalTo(self.mas_bottom).with.offset(-10);
make.right.equalTo(self.mas_right).with.offset(-10);
make.top.equalTo(self.mas_top).with.offset(10);
}];
self.textLabel.layer.borderColor = [UIColor grayColor].CGColor;
self.textLabel.layer.borderWidth = 3;
}
* @ implementation MasonryTestTableViewCell
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
return [super initWithStyle:style reuseIdentifier:reuseIdentifier];
}
- (void) setContent:(UIView *)view{
[self setBackgroundColor:[UIColor greenColor]];
[self addSubview:view];
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.mas_top).with.offset(kYPosition);
make.bottom.equalTo(self.mas_bottom).with.offset(-kYPosition);
make.left.equalTo(self.mas_left).with.offset(kCellPadding);
make.right.equalTo(self.mas_right).with.offset(-kCellPadding);
}];
}
我现在面临的问题是单元格没有正确升级,如果我在textLabel上设置一个长文本,它不会增加单元格高度,我可以解决这个问题,你知道是否还有别的东西可以做到这一点吗?
答案 0 :(得分:0)
Masonry只是NSAutolayoutConstraint功能的包装框架。为了正确调整单元格大小,您应该通过
为tableView提供高度信息- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return [self heightForBasicCellAtIndexPath:indexPath];
}
方法heightForBasicCellAtIndexPath:
看起来像
- (CGFloat)heightForBasicCellAtIndexPath:(NSIndexPath *)indexPath {
static UITableViewCell *sizingCell = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sizingCell = [self.tableView dequeueReusableCellWithIdentifier:@"your_Cell_identifier"];
});
[self configureBasicCell:sizingCell atIndexPath:indexPath];
return [self calculateHeightForConfiguredSizingCell:sizingCell];
}
- (CGFloat)calculateHeightForConfiguredSizingCell:(UITableViewCell *)sizingCell {
[sizingCell setNeedsLayout];
[sizingCell layoutIfNeeded];
CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.height + 1.0f; // Add 1.0f for the cell separator height
}
最后要做的事情 - 定义configureBasicCell: atIndexPath:
在你的情况下,它可能看起来像:
- (void)configureBasicCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
[cell addSubview:[self createViewForCell]];
}
有关详细信息,请参阅this
希望这有帮助
答案 1 :(得分:0)
Doro展示了一种解决问题的方法,但我认为如何处理问题取决于您选择动态制作单元格高度的方式。
如果您使用autoLayout和UITableViewAutomaticDimension,那么您不必通过代码计算高度,只需使内部子视图拉伸单元格的高度。
在这种情况下,我在你的代码中发现了bug,你必须让cell.contentView改为addSubview而不是cell本身。
我希望它有效,祝你好运!