Swift 将CALayer作为子层添加到UIImage时出现意外行为
我有自定义单元格的tableView。每个单元格都有属性“name”和“image”。我试图做的是在图像周围添加边框。这部分是有效的。但当我尝试向CALayer添加背景色时,我在tableView中只能看到没有UIImage的CALayer 下面是一些代码,用于更好地理解和设置背景色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()
@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