macOS图片视图NSImageView
macOS图片视图NSImageView

macOS图片视图NSImageView

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,允许直接赋值更新图片。对于大图性能优化好,支持拖拽、复制、缩放等功能。

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注