Swift 将CALayer作为子层添加到UIImage时出现意外行为

Swift 将CALayer作为子层添加到UIImage时出现意外行为,swift,uiimage,calayer,Swift,Uiimage,Calayer,我有自定义单元格的tableView。每个单元格都有属性“name”和“image”。我试图做的是在图像周围添加边框。这部分是有效的。但当我尝试向CALayer添加背景色时,我在tableView中只能看到没有UIImage的CALayer 下面是一些代码,用于更好地理解和设置背景色 @IBOutlet weak var channelImage: UIImageView! { didSet { let borderLayer = CALayer()

我有自定义单元格的tableView。每个单元格都有属性“name”和“image”。我试图做的是在图像周围添加边框。这部分是有效的。但当我尝试向CALayer添加背景色时,我在tableView中只能看到没有UIImage的CALayer

下面是一些代码,用于更好地理解和设置背景色

 @IBOutlet weak var channelImage: UIImageView! {
        didSet {
            let borderLayer = CALayer()
            let borderFrame = CGRect(x: -4, y: -4, width: channelImage.frame.size.width+8, height: channelImage.frame.size.width+8)
            borderLayer.frame = borderFrame
            borderLayer.cornerRadius = 4
            borderLayer.borderWidth = 0.5
            borderLayer.borderColor = UIColor.lightGray.cgColor
            channelImage.layer.insertSublayer(borderLayer, at: 0)
            channelImage.layer.masksToBounds = false
            borderLayer.backgroundColor = UIColor.lightGray.cgColor
            self.channelImage.layoutIfNeeded()
            self.channelImage.layoutSubviews()
        }
    }
无背景色:

@IBOutlet weak var channelImage: UIImageView! {
    didSet {
        let borderLayer = CALayer()
        let borderFrame = CGRect(x: -4, y: -4, width: channelImage.frame.size.width+8, height: channelImage.frame.size.width+8)
        borderLayer.frame = borderFrame
        borderLayer.cornerRadius = 4
        borderLayer.borderWidth = 0.5
        borderLayer.borderColor = UIColor.lightGray.cgColor
        channelImage.layer.insertSublayer(borderLayer, at: 0)
        channelImage.layer.masksToBounds = false
        self.channelImage.layoutIfNeeded()
        self.channelImage.layoutSubviews()
    }
}
这里还有参考第一个和第二个示例的图像:

我做了很多调查,但我没有找到适合我情况的答案

这是这个单元的完整代码

class ChannelCell: UITableViewCell, ChannelSettable {

    static let reusableID = "channelCell"

    var channel: Channel? = nil {
        didSet {
            self.channelName.text = channel?.channelName ?? ""
            self.channelImage.image = UIImage(named: channel?.channel ?? "") ?? UIImage(named: "TV")
            self.channelCategory.text = channel?.chCategory ?? ""
        }
    }

    @IBOutlet weak var channelName: UILabel!
    @IBOutlet weak var channelCategory: UILabel!
    @IBOutlet weak var channelImage: UIImageView! {
        didSet {
            let borderLayer = CALayer()
            let borderFrame = CGRect(x: -4, y: -4, width: channelImage.frame.size.width+8, height: channelImage.frame.size.width+8)
            borderLayer.frame = borderFrame
            borderLayer.cornerRadius = 4
            borderLayer.borderWidth = 0.5
            borderLayer.borderColor = UIColor.lightGray.cgColor
            borderLayer.backgroundColor = UIColor.lightGray.cgColor
            channelImage.layer.insertSublayer(borderLayer, at: 0)
            channelImage.layer.masksToBounds = false
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        self.channelName.font = DesignHelper.channelNameFont
        self.channelCategory.font = DesignHelper.channelCategoryFont
        self.layoutIfNeeded()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

您可以直接向UIImageView的图层添加边框,如下所示:

channelImage.layer.borderWidth = 0.5
channelImage.layer.borderColor = UIColor.lightGray.cgColor
你不必麻烦额外的一层来做这件事

但是,如果仍然需要添加额外的CALayer,请尝试使用以下方法:

func insertSublayer(CALayer, above: CALayer?)
func insertSublayer(CALayer, below: CALayer?)

子层将插入到图像视图中

如果要设置imageView的背景,请使用

channelImage.backgroundColor = UIColor.lightGray.cgColor
您可以使用在图层内添加图像(如果您希望在图像后面添加图层)


我知道如何将边框直接添加到UIImageView,但在我的情况下,我希望边框位于单独的层中,因为边框帧大小需要大于图像的帧大小。我还尝试了您提到的两种方法,结果仍然相同。如果您只想添加比ImageView更大的边框,可以使用UIKit在ImageView下面插入一个子视图,该子视图更大。然后设置其背景色。如果你愿意的话,你可以用CALayer的房产来绕过它。您可以使用UIView类中的insertSubview(:UpperSubView:)或insertSubview(:belowSubview:)来执行此操作,但是,当我想要更改CALayer帧大小相对于UIImage帧大小的偏移量时,我必须更改约束条件等,而这不是我想要实现的。您确定正确地隔离了问题吗?我无法重现所描述的巴哈维奥意义:我正确地看到了周围有边框的图像。然后寻找一些外部因素…你给CALayer添加了背景色吗?因为没有背景色,一切看起来都正常。我也知道这一步/可能的解决方案,但由于我的CALayer大于图像帧,这对我不起作用,因为只有图像层的背景色发生了变化。而且,在calayer和图像框之间有白色边框。真正的问题是,即使我将图层作为子图层插入,为什么还要在图像视图上方插入图层。然后只需将UIImage添加到CALayer中即可(查看更新的答案)
borderLayer.contents = channelImage.cgImage