微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UILabel 未显示所有文本 UITableViewCell 子类主视图 - 有一个表视图作为子视图AutosizingTableView

如何解决UILabel 未显示所有文本 UITableViewCell 子类主视图 - 有一个表视图作为子视图AutosizingTableView

我在 UITableViewCell 子类中有两个标签。我希望两个标签都是多行标签,因此我将两个标签的行数设置为零。但问题是标签不断被截断。例如,我已将右侧标签的文本大小设置得更大以使其更高,但随后我在左侧的第一个标签添加了大量文本。但是,它不会继续换行并添加更多行,而是在与右侧标签大小相同时截断。

enter image description here

但是左边的标签应该显示更多的文本,它应该多取几行,但是当它到达另一个标签的高度时它被截断了。这几乎就像我在两个标签之间有高度限制,但我没有。

这是我为此使用的代码。第一部分是表格视图单元格子类,它有两个标签——firstLabel(左边的)和 secondLabel(右边的)。接下来,我有包含表视图的视图的代码,并显示了如何配置表视图。最后,还有一个 UITableView 子类,它将表格的内在内容大小设置为表格的内容大小。我添加了这个是因为没有这个表框架总是保持为零,所以表视图数据源方法不会被调用。如果有人也知道这样做的更好方法,那将不胜感激。

UITableViewCell 子类

这是我的 UITableViewCell 的实现。我对两个标签都有垂直内容拥抱和内容压缩优先级,但我已经尝试过有和没有这些优先级,结果是一样的。

@interface MyTableViewCell ()

@property (strong,nonatomic) UILabel *firstLabel;
@property (strong,nonatomic) UILabel *secondLabel;

@end

@implementation MyTableViewCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(Nsstring *)reuseIdentifier {
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        [self initialize];
    }
    return self;
}

- (void)initialize {
    [self.contentView setBackgroundColor:[UIColor systemtealColor]];
    [self.backgroundView setBackgroundColor:[UIColor systemGrayColor]];
    
    [self.contentView addSubview:self.firstLabel];
    [self.contentView addSubview:self.secondLabel];
    
    NSLayoutConstraint *heightConstraint = [self.heightAnchor constraintEqualToConstant:1.0f];
    [heightConstraint setPriority:50];
    
    [NSLayoutConstraint activateConstraints:@[
        [self.firstLabel.leadingAnchor constraintEqualToAnchor:self.contentView.layoutMarginsGuide.leadingAnchor],[self.firstLabel.topAnchor constraintEqualToAnchor:self.contentView.layoutMarginsGuide.topAnchor],[self.firstLabel.trailingAnchor constraintEqualToAnchor:self.centerXAnchor constant:-4.0f],[self.secondLabel.leadingAnchor constraintEqualToAnchor:self.centerXAnchor constant:4.0f],[self.secondLabel.topAnchor constraintEqualToAnchor:self.contentView.layoutMarginsGuide.topAnchor],[self.secondLabel.trailingAnchor constraintEqualToAnchor:self.contentView.layoutMarginsGuide.trailingAnchor],[self.contentView.layoutMarginsGuide.bottomAnchor constraintGreaterThanorEqualToAnchor:self.firstLabel.bottomAnchor constant:20.0f],[self.contentView.layoutMarginsGuide.bottomAnchor constraintGreaterThanorEqualToAnchor:self.secondLabel.bottomAnchor constant:20.0f],heightConstraint
    ]];
}

- (UILabel *)firstLabel {
    if (!self->_firstLabel) {
        self->_firstLabel = [[UILabel alloc] init];
        self->_firstLabel.translatesAutoresizingMaskIntoConstraints = NO;
        self->_firstLabel.numberOfLines = 0;
        self->_firstLabel.userInteractionEnabled = NO;
        self->_firstLabel.contentMode = UIViewContentModeScaletoFill;
        [self->_firstLabel setContentHuggingPriority:251 forAxis:UILayoutConstraintAxisHorizontal];
        [self->_firstLabel setContentHuggingPriority:251 forAxis:UILayoutConstraintAxisvertical];
        [self->_firstLabel setContentCompressionResistancePriority:UILayoutPriorityrequired forAxis:UILayoutConstraintAxisHorizontal];
        [self->_firstLabel setContentCompressionResistancePriority:UILayoutPriorityrequired forAxis:UILayoutConstraintAxisvertical];
        self->_firstLabel.textAlignment = NSTextAlignmentNatural;
        self->_firstLabel.lineBreakMode = NSLineBreakByTruncatingTail;
        self->_firstLabel.baselineAdjustment = UIBaselineAdjustmentAlignBaselines;
        self->_firstLabel.adjustsFontSizetoFitWidth = NO;
        self->_firstLabel.backgroundColor = [UIColor orangeColor];
    }
    return self->_firstLabel;
}

- (UILabel *)secondLabel {
    if (!self->_secondLabel) {
        self->_secondLabel = [[UILabel alloc] init];
        self->_secondLabel.translatesAutoresizingMaskIntoConstraints = NO;
        self->_secondLabel.numberOfLines = 0;
        self->_secondLabel.userInteractionEnabled = NO;
        self->_secondLabel.contentMode = UIViewContentModeScaletoFill;
        [self->_secondLabel setContentHuggingPriority:251 forAxis:UILayoutConstraintAxisHorizontal];
        [self->_secondLabel setContentHuggingPriority:251 forAxis:UILayoutConstraintAxisvertical];
        [self->_secondLabel setContentCompressionResistancePriority:UILayoutPriorityrequired forAxis:UILayoutConstraintAxisHorizontal];
        [self->_secondLabel setContentCompressionResistancePriority:UILayoutPriorityrequired forAxis:UILayoutConstraintAxisvertical];
        self->_secondLabel.textAlignment = NSTextAlignmentNatural;
        self->_secondLabel.lineBreakMode = NSLineBreakByTruncatingTail;
        self->_secondLabel.baselineAdjustment = UIBaselineAdjustmentAlignBaselines;
        self->_secondLabel.adjustsFontSizetoFitWidth = NO;
        self->_secondLabel.backgroundColor = [UIColor yellowColor];
    }
    return self->_secondLabel;
}

- (void)setData:(MyModel *)data {
    self.firstLabel.text = data.first;
    self.secondLabel.text = data.second;
    [self invalidateIntrinsicContentSize];
}

@end

主视图 - 有一个表视图作为子视图

这是显示的实际视图。作为较大应用程序的一部分,此视图随后显示在垂直的 UIStackView 中。

这个视图有一个表格视图作为唯一的子视图,表格视图通过自动布局固定在这个视图的边缘。 UITableView 实际上是另一个名为“autosizingTableView”的类的实例,用于让表格视图自动调整大小(没有这个,表格的框架保持为零,并且表格视图数据源方法 tableView:cellForRowAtIndexPath: 永远不会被调用因为表格高度为零。此表格视图的代码包含在本节之后。

@interface MyView ()

@property (strong,nonatomic) autosizingTableView *tableView;

@end

@implementation MyView

- (instancetype)init {
    return [self initWithFrame:CGRectZero];
}

- (instancetype)initWithCoder:(NSCoder *)coder {
    if (self = [super initWithCoder:coder]) {
        [self initialize];
    }
    return self;
}

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self initialize];
    }
    return self;
}

- (void)initialize {
    [self addSubview:self.tableView];
    
    [NSLayoutConstraint activateConstraints:@[
        [self.tableView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor],[self.tableView.topAnchor constraintEqualToAnchor:self.topAnchor],[self.tableView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor],[self.tableView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor],[self.tableView.widthAnchor constraintEqualToAnchor:self.widthAnchor]
    ]];
}

- (UITableView *)tableView {
    if (!self->_tableView) {
        self->_tableView = [[autosizingTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
        self->_tableView.translatesAutoresizingMaskIntoConstraints = NO;
        self->_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        self->_tableView.rowHeight = UITableViewAutomaticDimension;
        self->_tableView.estimatedRowHeight = UITableViewAutomaticDimension;
        self->_tableView.allowsSelection = NO;
        self->_tableView.scrollEnabled = NO;
        self->_tableView.delegate = self;
        self->_tableView.dataSource = self;
        [self->_tableView registerClass:[MyTableViewCell class] forCellReuseIdentifier:@"myTableViewCell"];
    }
    return self->_tableView;
}

- (void)setdata:(NSArray<MyData *> *)data {
    self->_data = data;
    [self.tableView reloadData];
}

#pragma mark - UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.data.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myTableViewCell" forIndexPath:indexPath];
    MyData *data = self.data[indexPath.row];
    cell.detail = detail;
    return cell;
}

@end

autosizingTableView

正如在上一节中提到的,这只是为了让 table view 自动调整大小。如果没有这个,表格视图高度为零并保持为零,因为 tableView:cellForRowAtIndexPath: 方法因表格视图高度而从未被调用

@implementation autosizingTableView

- (CGSize)intrinsicContentSize {
    return self.contentSize;
}

- (void)setContentSize:(CGSize)contentSize {
    [super setContentSize:contentSize];
    [self invalidateIntrinsicContentSize];
}

@end

解决方法

有点难以确定,因为您没有提供完整的工作示例,但这可能解决您的问题。

查看修改意见:

@interface MyTableViewCell ()

@property (strong,nonatomic) UILabel *firstLabel;
@property (strong,nonatomic) UILabel *secondLabel;

@end

@implementation MyTableViewCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        [self initialize];
    }
    return self;
}

- (void)initialize {
    [self.contentView setBackgroundColor:[UIColor systemTealColor]];
    [self.backgroundView setBackgroundColor:[UIColor systemGrayColor]];
    
    [self.contentView addSubview:self.firstLabel];
    [self.contentView addSubview:self.secondLabel];
    
    // not needed
    //NSLayoutConstraint *heightConstraint = [self.heightAnchor constraintEqualToConstant:1.0f];
    //[heightConstraint setPriority:50];
    
    [NSLayoutConstraint activateConstraints:@[
        [self.firstLabel.leadingAnchor constraintEqualToAnchor:self.contentView.layoutMarginsGuide.leadingAnchor],[self.firstLabel.topAnchor constraintEqualToAnchor:self.contentView.layoutMarginsGuide.topAnchor],[self.firstLabel.trailingAnchor constraintEqualToAnchor:self.centerXAnchor constant:-4.0f],[self.secondLabel.leadingAnchor constraintEqualToAnchor:self.centerXAnchor constant:4.0f],[self.secondLabel.topAnchor constraintEqualToAnchor:self.contentView.layoutMarginsGuide.topAnchor],[self.secondLabel.trailingAnchor constraintEqualToAnchor:self.contentView.layoutMarginsGuide.trailingAnchor],[self.contentView.layoutMarginsGuide.bottomAnchor constraintGreaterThanOrEqualToAnchor:self.firstLabel.bottomAnchor constant:20.0f],[self.contentView.layoutMarginsGuide.bottomAnchor constraintGreaterThanOrEqualToAnchor:self.secondLabel.bottomAnchor constant:20.0f],// not needed
        //heightConstraint
    ]];
}

- (UILabel *)firstLabel {
    if (!self->_firstLabel) {
        self->_firstLabel = [[UILabel alloc] init];
        self->_firstLabel.translatesAutoresizingMaskIntoConstraints = NO;
        self->_firstLabel.numberOfLines = 0;
        self->_firstLabel.userInteractionEnabled = NO;
        
        // not needed
        //self->_firstLabel.contentMode = UIViewContentModeScaleToFill;
        //[self->_firstLabel setContentHuggingPriority:251 forAxis:UILayoutConstraintAxisHorizontal];
        //[self->_firstLabel setContentHuggingPriority:251 forAxis:UILayoutConstraintAxisVertical];
        //[self->_firstLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
        //[self->_firstLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
        
        self->_firstLabel.textAlignment = NSTextAlignmentNatural;
        
        // word-wrapping,not truncating
        //self->_firstLabel.lineBreakMode = NSLineBreakByTruncatingTail;
        self->_firstLabel.lineBreakMode = NSLineBreakByWordWrapping;
        
        self->_firstLabel.baselineAdjustment = UIBaselineAdjustmentAlignBaselines;
        self->_firstLabel.adjustsFontSizeToFitWidth = NO;
        self->_firstLabel.backgroundColor = [UIColor orangeColor];
    }
    return self->_firstLabel;
}

- (UILabel *)secondLabel {
    if (!self->_secondLabel) {
        self->_secondLabel = [[UILabel alloc] init];
        self->_secondLabel.translatesAutoresizingMaskIntoConstraints = NO;
        self->_secondLabel.numberOfLines = 0;
        self->_secondLabel.userInteractionEnabled = NO;
        
        // not needed
        //self->_secondLabel.contentMode = UIViewContentModeScaleToFill;
        //[self->_secondLabel setContentHuggingPriority:251 forAxis:UILayoutConstraintAxisHorizontal];
        //[self->_secondLabel setContentHuggingPriority:251 forAxis:UILayoutConstraintAxisVertical];
        //[self->_secondLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
        //[self->_secondLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];

        self->_secondLabel.textAlignment = NSTextAlignmentNatural;
        
        // word-wrapping,not truncating
        //self->_secondLabel.lineBreakMode = NSLineBreakByTruncatingTail;
        self->_secondLabel.lineBreakMode = NSLineBreakByWordWrapping;
        
        self->_secondLabel.baselineAdjustment = UIBaselineAdjustmentAlignBaselines;
        self->_secondLabel.adjustsFontSizeToFitWidth = NO;
        self->_secondLabel.backgroundColor = [UIColor yellowColor];
    }
    return self->_secondLabel;
}

- (void)setData:(MyData *)data {
    self.firstLabel.text = data.first;
    self.secondLabel.text = data.second;
    
    // this is needed
    [self.firstLabel layoutIfNeeded];
    [self.secondLabel layoutIfNeeded];
    
    // not needed
    //[self invalidateIntrinsicContentSize];
}

@end

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。