若使用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;
}
}
最终展示效果: