// // KBPersonInfoItemCell.m // keyBoard // // Created by Codex on 2025/11/11. // @import UIKit; #import "KBPersonInfoItemCell.h" #import @interface KBPersonInfoItemCell () // 白色圆角容器(实现卡片效果) @property (nonatomic, strong) UIView *cardView; // 标题(左) @property (nonatomic, strong) UILabel *titleLabel; // 值(右) @property (nonatomic, strong) UILabel *valueLabel; // 箭头(>) @property (nonatomic, strong) UIImageView *arrowView; // 复制按钮 @property (nonatomic, strong) UIButton *copyBtn; // 分割线 // 废弃分割线:按需求不显示底部分割线 // 记录圆角位置,layoutSubviews 时更新 mask @property (nonatomic, assign) UIRectCorner cornerRecord; @end @implementation KBPersonInfoItemCell - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { self.backgroundColor = UIColor.clearColor; self.selectionStyle = UITableViewCellSelectionStyleNone; [self.contentView addSubview:self.cardView]; [self.cardView addSubview:self.titleLabel]; [self.cardView addSubview:self.valueLabel]; [self.cardView addSubview:self.arrowView]; [self.cardView addSubview:self.copyBtn]; [self.cardView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.contentView).offset(16); make.right.equalTo(self.contentView).offset(-16); make.top.equalTo(self.contentView); make.bottom.equalTo(self.contentView); }]; [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.cardView).offset(16); make.centerY.equalTo(self.cardView); }]; [self.arrowView mas_makeConstraints:^(MASConstraintMaker *make) { make.right.equalTo(self.cardView).offset(-16); make.centerY.equalTo(self.cardView); make.width.mas_equalTo(10); make.height.mas_equalTo(16); }]; [self.copyBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.equalTo(self.cardView); make.right.equalTo(self.cardView).offset(-16); make.width.height.mas_equalTo(22); }]; [self.valueLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.equalTo(self.cardView); make.right.equalTo(self.arrowView.mas_left).offset(-8); }]; // 不添加底部分割线 } return self; } - (void)layoutSubviews { [super layoutSubviews]; // 根据位置设置圆角:顶部或底部为 12,中间为 0 self.cardView.layer.cornerRadius = (self.cornerRecord != 0 ? 12.0 : 0.0); // 根据记录的 corner 重新生成 mask,保证尺寸变化后仍正确 if (self.cornerRecord != 0 && !CGRectIsEmpty(self.cardView.bounds)) { UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.cardView.bounds byRoundingCorners:self.cornerRecord cornerRadii:CGSizeMake(12, 12)]; CAShapeLayer *mask = [CAShapeLayer layer]; mask.frame = self.cardView.bounds; mask.path = path.CGPath; self.cardView.layer.mask = mask; } else { self.cardView.layer.mask = nil; } } - (void)prepareForReuse { [super prepareForReuse]; self.arrowView.hidden = YES; self.copyBtn.hidden = YES; } - (void)configWithTitle:(NSString *)title value:(NSString *)value showArrow:(BOOL)showArrow showCopy:(BOOL)showCopy isTop:(BOOL)isTop isBottom:(BOOL)isBottom { self.titleLabel.text = title ?: @""; self.valueLabel.text = value ?: @""; self.arrowView.hidden = !showArrow; self.copyBtn.hidden = !showCopy; self.valueLabel.textColor = showArrow ? [UIColor blackColor] : [UIColor colorWithWhite:0.2 alpha:1.0]; // 当显示复制按钮时,值需要靠左到复制按钮左侧 UIView *rightAnchor = showCopy ? self.copyBtn : self.arrowView; [self.valueLabel mas_remakeConstraints:^(MASConstraintMaker *make) { make.centerY.equalTo(self.cardView); make.right.equalTo(rightAnchor.mas_left).offset(-8); }]; // 顶部/底部圆角控制 + 分割线 UIRectCorner corners = 0; if (isTop && isBottom) { corners = UIRectCornerAllCorners; } else if (isTop) { corners = UIRectCornerTopLeft | UIRectCornerTopRight; } else if (isBottom) { corners = UIRectCornerBottomLeft | UIRectCornerBottomRight; } else { corners = 0; } // 使用遮罩实现指定圆角 // 记录并等待 layoutSubviews 里按实际尺寸设置 mask self.cornerRecord = corners; [self setNeedsLayout]; } #pragma mark - Lazy UI - (UIView *)cardView { if (!_cardView) { _cardView = [UIView new]; _cardView.backgroundColor = UIColor.whiteColor; _cardView.layer.cornerRadius = 0.0; // 具体圆角在 layoutSubviews 中按位置设置 _cardView.layer.masksToBounds = YES; // 配合圆角 } return _cardView; } - (UILabel *)titleLabel { if (!_titleLabel) { _titleLabel = [UILabel new]; _titleLabel.textColor = [UIColor colorWithHex:KBBlackValue]; _titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightRegular]; } return _titleLabel; } - (UILabel *)valueLabel { if (!_valueLabel) { _valueLabel = [UILabel new]; _valueLabel.textColor = [UIColor colorWithHex:KBBlackValue]; _valueLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightSemibold]; _valueLabel.textAlignment = NSTextAlignmentRight; [_valueLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; } return _valueLabel; } - (UIImageView *)arrowView { if (!_arrowView) { _arrowView = [[UIImageView alloc] init]; _arrowView.contentMode = UIViewContentModeScaleAspectFit; UIImage *img = nil; if (@available(iOS 13.0, *)) { img = [UIImage systemImageNamed:@"chevron.right"]; } if (!img) { // 简易绘制一个三角箭头作为兜底 CGSize size = CGSizeMake(10, 16); UIGraphicsBeginImageContextWithOptions(size, NO, 0); UIBezierPath *p = [UIBezierPath bezierPath]; [p moveToPoint:CGPointMake(2, 2)]; [p addLineToPoint:CGPointMake(8, 8)]; [p addLineToPoint:CGPointMake(2, 14)]; [[UIColor colorWithWhite:0.7 alpha:1] setStroke]; p.lineWidth = 2; [p stroke]; img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } _arrowView.image = img; _arrowView.tintColor = [UIColor colorWithWhite:0.7 alpha:1]; _arrowView.hidden = YES; } return _arrowView; } - (UIButton *)copyBtn { if (!_copyBtn) { _copyBtn = [UIButton buttonWithType:UIButtonTypeSystem]; UIImage *img = nil; if (@available(iOS 13.0, *)) { img = [UIImage systemImageNamed:@"doc.on.doc"]; } if (!img) { // 兜底绘制一个简单的 copy 图标 CGSize sz = CGSizeMake(22, 22); UIGraphicsBeginImageContextWithOptions(sz, NO, 0); CGContextRef ctx = UIGraphicsGetCurrentContext(); [[UIColor colorWithWhite:0.85 alpha:1] setStroke]; CGContextSetLineWidth(ctx, 2); CGContextStrokeRect(ctx, CGRectMake(6, 6, 12, 12)); CGContextStrokeRect(ctx, CGRectMake(4, 4, 12, 12)); img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } [_copyBtn setImage:img forState:UIControlStateNormal]; _copyBtn.tintColor = [UIColor colorWithWhite:0.6 alpha:1]; _copyBtn.hidden = YES; [_copyBtn addTarget:self action:@selector(onCopy) forControlEvents:UIControlEventTouchUpInside]; } return _copyBtn; } // 无分割线 #pragma mark - Event - (void)onCopy { // 简单示例:复制 valueLabel 文本 NSString *txt = self.valueLabel.text ?: @""; if (txt.length == 0) return; UIPasteboard.generalPasteboard.string = txt; } @end