表视图单元格上的 iOS 砌体

Posted

技术标签:

【中文标题】表视图单元格上的 iOS 砌体【英文标题】:iOS masonry on tableView cells 【发布时间】:2015-06-29 05:02:14 【问题描述】:

我在表格视图单元格上使用 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 上设置一个长文本,它不会增加单元格高度,我可以'不解决这个问题,你知道ai是否应该做其他事情来让它工作?

【问题讨论】:

【参考方案1】:

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

希望对你有帮助

【讨论】:

【参考方案2】:

Doro 展示了一种解决您的问题的方法,但我认为如何处理您的问题取决于您选择动态设置单元格高度的方式。 如果您使用autoLayout和UITableViewAutomaticDimension,那么您不必通过代码计算高度,只需使内部子视图拉伸单元格的高度即可。 在这种情况下,我在您的代码中发现了错误,您必须让 cell.contentView 来 addSubview 而不是单元格本身。 我希望它有效,祝你好运!

【讨论】:

以上是关于表视图单元格上的 iOS 砌体的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 如何查看表格视图单元格上的“滑动删除”操作?

在 iOS 7 上的导航视图控制器上使用后退手势时,表格视图单元格上没有淡出和淡入动画

表视图单元格上的情节提要约束以匹配页脚内容

具有目标操作的单元格上的 iOS UIButton,单元格未在 (id)sender 中更新

我的tableview单元格上的组件不可见

集合视图单元格上的重叠阴影