iOS 14+中为UITableView单元格内图片添加边框(Swift)
解决方法
因为UIListContentConfiguration(也就是你用的defaultContentConfiguration()的返回类型)封装了内部的UIImageView,没法直接拿到实例修改layer,所以可以用以下两种方式实现图片加边框:
方案一:给UIImage本身添加边框(无需修改cell结构)
给UIImage写个扩展,生成带浅灰色边框的新图片,直接把这个带边框的图片赋值给cellConfig.image即可:
extension UIImage { func withLightGrayBorder(width: CGFloat = 1) -> UIImage? { let borderColor = UIColor.lightGray.cgColor let sizeWithBorder = CGSize(width: size.width + width*2, height: size.height + width*2) UIGraphicsBeginImageContextWithOptions(sizeWithBorder, false, scale) guard let context = UIGraphicsGetCurrentContext() else { return nil } // 绘制边框 context.setStrokeColor(borderColor) context.setLineWidth(width) let rect = CGRect(origin: CGPoint(x: width/2, y: width/2), size: size) context.stroke(rect) // 绘制原图 draw(in: rect) let borderedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return borderedImage } }
然后在你的cellForRowAt里修改图片处理部分:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Picture", for: indexPath) var cellConfig = cell.defaultContentConfiguration() let cellImage = UIImage(named: "Flags/" + pictures[indexPath.row])? .resize(withSize: CGSize(width: 50, height: 25)) .withLightGrayBorder() // 调用扩展方法添加边框 cellConfig.image = cellImage cellConfig.text = countries[indexPath.row] cell.contentConfiguration = cellConfig return cell }
方案二:自定义UITableViewCell(更灵活可控)
如果后续需要对图片或文字做更多自定义,建议直接自定义cell:
- 先创建自定义cell类:
class CustomPictureCell: UITableViewCell { // 自定义图片视图 let flagImageView: UIImageView = { let iv = UIImageView() iv.layer.borderColor = UIColor.lightGray.cgColor iv.layer.borderWidth = 1 iv.contentMode = .scaleAspectFit iv.translatesAutoresizingMaskIntoConstraints = false return iv }() // 自定义文本标签 let countryLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false return label }() override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) setupLayout() } required init?(coder: NSCoder) { super.init(coder: coder) setupLayout() } private func setupLayout() { contentView.addSubview(flagImageView) contentView.addSubview(countryLabel) NSLayoutConstraint.activate([ flagImageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 16), flagImageView.centerYAnchor.constraint(equalTo: contentView.centerYAnchor), flagImageView.widthAnchor.constraint(equalToConstant: 50), flagImageView.heightAnchor.constraint(equalToConstant: 25), countryLabel.leadingAnchor.constraint(equalTo: flagImageView.trailingAnchor, constant: 12), countryLabel.centerYAnchor.constraint(equalTo: contentView.centerYAnchor), countryLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -16) ]) } }
- 在
cellForRowAt里使用自定义cell:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "CustomPicture", for: indexPath) as! CustomPictureCell let cellImage = UIImage(named: "Flags/" + pictures[indexPath.row])?.resize(withSize: CGSize(width: 50, height: 25)) cell.flagImageView.image = cellImage cell.countryLabel.text = countries[indexPath.row] return cell }
注意:记得在Storyboard或者代码注册cell的时候,把identifier改成"CustomPicture",并设置cell类为CustomPictureCell。
内容的提问来源于stack exchange,提问作者Torrontés
相关产品推荐
相关产品推荐

