You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 先创建自定义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)
        ])
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:00:57