iOS 自定义cell 关于使用Masonry切任意圆角无效

若使用Masonry布局的视图设置后发现,设置的圆角不起作用。这是因为设置布局后视图并没有立即计算出frame值。需要调用layoutIfNeeded(告知页面布局立刻更新)或在viewDidLayoutSubviews方法中再设置。

在自定义cell时,使用上述方法,label使用masonry切任意圆角,label上的文字会不显示,也看不到任意圆角。
    _flagLabel = [UILabel new];
    _flagLabel.font = [UIFont systemFontOfSize:10];
    _flagLabel.textColor = [UIColor whiteColor];
    [_baseView addSubview:_flagLabel];
    [_flagLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.left.offset(0);
        make.height.offset(15);
    }];

    [_flagLabel layoutIfNeeded];
    
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:_flagLabel.bounds byRoundingCorners:UIRectCornerBottomRight|UIRectCornerTopLeft cornerRadii:CGSizeMake(7, 7)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];
    maskLayer.frame = _flagLabel.bounds;
    maskLayer.path = maskPath.CGPath;
    _flagLabel.layer.mask = maskLayer;
解决方法:在-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中,切任意圆角前先加上[cell.flagLabel layoutIfNeeded];这句话很重要,要不然切圆角时获取到label.frame为空。

自定义cell.m

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if ([super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        [self issueListView];
    }
    return self;
}

- (void)issueListView {
    _baseView = [UIView new];
    _baseView.layer.cornerRadius = 7;
    _baseView.backgroundColor = [UIColor whiteColor];
    [self.contentView addSubview:_baseView];
    [_baseView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.left.offset(10);
        make.right.offset(-10);
        make.bottom.offset(0);
    }];

    _flagLabel = [UILabel new];
    _flagLabel.font = [UIFont systemFontOfSize:10];
    _flagLabel.textColor = [UIColor whiteColor];
    _flagLabel.backgroundColor = __Color(255, 92, 0);
    [_baseView addSubview:_flagLabel];
    [_flagLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.left.offset(0);
        make.height.offset(15);
    }];
    
    _titleLabel = [UILabel new];
    _titleLabel.font = [UIFont systemFontOfSize:16];
    _titleLabel.textColor = [UIColor blackColor];
    [_baseView addSubview:_titleLabel];
    [_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.offset(15);
        make.right.offset(-15);
    }];
    
    _nameLabel = [UILabel new];
    _nameLabel.font = [UIFont systemFontOfSize:14];
    _nameLabel.textColor = [UIColor grayColor];
    [_baseView addSubview:_nameLabel];
    [_nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(_titleLabel.mas_bottom).offset(10);
        make.left.offset(15);
        make.right.offset(-15);
    }];
    
    _timeLabel = [UILabel new];
    _timeLabel.font = [UIFont systemFontOfSize:14];
    _timeLabel.textColor = [UIColor grayColor];
    [_baseView addSubview:_timeLabel];
    [_timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(_nameLabel.mas_bottom).offset(10);
        make.left.offset(15);
        make.right.offset(-15);
        make.bottom.offset(-10);
    }];
    
    _titleConstraint = [NSLayoutConstraint constraintWithItem:_titleLabel attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:_flagLabel attribute:NSLayoutAttributeBottom multiplier:1.0 constant:10];
    [self.contentView addConstraint:_titleConstraint];
}


- (void)setModel:(PModel *)model {
    if ([model.contentDict[@"csflag"]isEqualToString:@"s01"]) {//未完成:s01,完成:s02
        _flagLabel.text = @"  未完成 ";
        _flagLabel.backgroundColor = __Color(255, 92, 0);
    } else if ([model.contentDict[@"csflag"]isEqualToString:@"s02"]) {
        _flagLabel.text = @"  已完成 ";
        _flagLabel.backgroundColor = __Color(23, 193, 146);
    } else {
        _flagLabel.text = @"";
    }
}

亲测后,只能将切圆角的方法写在cellForRowAtIndexPath:中才起作用。记得加上[cell.flagLabel layoutIfNeeded];
controllerview.m

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *flag = @"issueList";
    TaskListCell *cell = [tableView dequeueReusableCellWithIdentifier:flag forIndexPath:indexPath];
    [self setModelOfCell:cell atIndexPath:indexPath];
    cell.backgroundColor = [UIColor clearColor];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return cell;
}

- (void)setModelOfCell:(TaskListCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    NSMutableDictionary *tempDict = [NSMutableDictionary dictionaryWithDictionary:listData[indexPath.section]];
    [tempDict setObject:[NSString stringWithFormat:@"%d",lastSelectFlag] forKey:@"flag"];
    cell.model = [PModel modelWithDictionary:tempDict];
    
    if ([listData[indexPath.section][@"csflag"]isEqualToString:@"s03"]) {//其它:s03 不显示状态
        cell.titleConstraint.constant = 0;
    } else {
        cell.titleConstraint.constant = 10;
        [cell.flagLabel layoutIfNeeded];
        
        UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:cell.flagLabel.bounds byRoundingCorners:UIRectCornerBottomRight|UIRectCornerTopLeft cornerRadii:CGSizeMake(7, 7)];
        CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];
        maskLayer.frame = cell.flagLabel.bounds;
        maskLayer.path = maskPath.CGPath;
        cell.flagLabel.layer.mask = maskLayer;
    }
}

最终展示效果:


iOS 自定义cell 关于使用Masonry切任意圆角无效_第1张图片
image.png
iOS 自定义cell 关于使用Masonry切任意圆角无效_第2张图片
image.png

你可能感兴趣的:(iOS 自定义cell 关于使用Masonry切任意圆角无效)