我有一个基于视图的NSTable
。使用tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?
构造创建一行视图。所有这些都很好。
在创建的单元格视图中是Avatar
,它是NSImageView
的子类。我正在尝试修改Avatar
,以使NSImageView
被舍入并填充宽高比-输入图像可以是任何尺寸的集合,因此需要进行长宽比填充以确保图形表达保持圆形/未填充
我找到了contentsGravity
和cornerRadius
,并认为这可能很简单-哦,我错了!
该图像从Internet位置缓存到文件系统上,可能无法立即使用,因此我怀疑我的某些问题始于此。
我尝试过的事情:
使用getter / setter覆盖Avatar.image
,这是从Google搜索中向我建议的,例如:
override var image: NSImage? {
set {
super.layer?.contentsGravity = kCAGravityResizeAspectFill
super.layer?.cornerRadius = (self.frame.height)/2
super.layer?.masksToBounds = true
super.wantsLayer = true
super.canDrawSubviewsIntoLayer = true
super.image = newValue
}
get {
return super.image
}
}
与上面的基本相同,但是在makeRounded
类中作为Avatar
类的函数而不是作为setter来进行,然后在设置了{ makeRounded
。
删除并重新添加了用于修改图层,蒙版,半径,重力的各种线条,以查看单个线条是否是我的问题的根源。 (这并没有使我更接近解决问题。)
实际发生的事情:
目前还不确定我是否遗漏了明显的东西或只是迷失了方向。
问题:
在某些示例中,我看到在修改NSImage
之前使用了super.layer? = CALayer.init()
。我似乎无法确定将其放入或删除是否会使情况变得更好或更糟?
没有layer
,我会遇到各种图形失真-这是正常现象吗?
如果我也没有设置canDrawSubviewsIntoLayer
,kCAGravityResizeAspectFill
真的在做什么吗?
显然,从我看到的其他帖子中,super.layer?.content
的位置也很重要,但是我将其移至其他各种图层或图像线的上方和下方都没有成功。
我到底在哪里错了?