NSImageView 是 AppKit 中专门用于显示图片的视图控件。
var imageView: NSImageView?
层级关系:
NSWindow
└── NSView (contentView)
└── NSImageView ← 显示图片
NSImageView 可以显示 NSImage,自动缩放、拉伸、居中、Retina渲染、拖拽、复制图片等功能。
常用属性
1、image:设置或获取当前显示的图片。
imageView.image = myNSImage
2、imageScaling:显示方式。
imageView.imageScaling = .scaleProportionallyUpOrDown
可选值:scaleProportionallyUpOrDown等比缩放、scaleAxesIndependently拉伸填满、scaleNone原尺寸和scaleProportionallyDown只缩小。
3、imageAlignment:对齐方式。
imageView.imageAlignment = .alignCenter
常用值:alignCenter、alignTop、alignBootom、alignLeft、alignRight。
4、animates:用于GIF/多帧图片。
imageView.animates = true
5、allowsCutCopyPaste:运行 Cmd+C 复制和 Cmd+V 粘贴。
imageView.allowsCutCopyPaste = true
6、editable:支持拖拽(拖入、拖出图片)。
imageView.isEditable = true
常用配置组合
1、设置图片:
imageView.image = myImage
2、清空图片:
imageView.image = nil
3、判断是否存在图片:
if imageView.image != nil { }
4、设置大小(不使用 AutoLayout 时):
imageView.setFrameSize(NSSize(width: 300, height: 300))
5、重绘:
imageView.needsDisplay = true
6、最小代码示例:
let imageView = NSImageView(frame: NSRect(x: 0, y: 0, width: 400, height: 300))
imageView.image = NSImage(named: "example")
imageView.imageScaling = .scaleProportionallyUpOrDown
7、图片预览窗口标准配置:
let imageView = NSImageView()
imageView.imageScaling = .scaleProportionallyUpOrDown
imageView.imageAlignment = .alignCenter
imageView.animates = true
imageView.allowsCutCopyPaste = true
imageView.isEditable = false
注意事项
1、固有内容尺寸过大的问题
在NSImageView中的图片,如果图片尺寸很大,就会拉伸窗口。
例如:
// NSImageView 的默认 intrinsicContentSize
let imageView = NSImageView()
imageView.image = someImage // 假设图片是 3000x2000
print(imageView.intrinsicContentSize)
// 输出: (3000.0, 2000.0) ← 返回图片的实际尺寸
即使配置 Auto Layout 和窗口的固定大小,仍然会导致显示图片过大的问题。
解决方案:重写NSImageView的intrinsicContentSize属性:
let imageView = CustomImageView()
imageView.imageScaling = .scaleProportionallyUpOrDown // 等比缩放
imageView.translatesAutoresizingMaskIntoConstraints = false // 禁用自动约束
// 重写 NSImageView
class CustomImageView: NSImageView {
override var intrinsicContentSize: NSSize {
return NSSize(width: NSView.noIntrinsicMetric, height: NSView.noIntrinsicMetric)
}
}
创建CustomImageView,重写intrinsicContentSize属性。NSView.noIntrinsicMetric 表示值为 -1,图片没有固有尺寸,可以根据外部约束决定大小。
总结
NSImageView适用于AppKit场景,相比SwiftUI Image,允许直接赋值更新图片。对于大图性能优化好,支持拖拽、复制、缩放等功能。
