NSScrollView 是 macOS AppKit 框架中用于滚动显示内容的视图容器。它允许用户在一个固定大小的窗口中滚动查看超出可见区域的内容。
基本用法
1、创建NSScrollView:
let scrollView = NSScrollView(frame: NSRect(x: 20, y: 20, width: 300, height: 200))
2、NSScrollView显示NSView视图:
scrollView.documentView = NSView(frame: NSRect(x: 0, y: 0, width: 800, height: 600))
组成结构

1、contentView:只显示其中的一部分
2、scrollers:自动或手动显示滚动条
常见用途
1、显示长文本:用于容纳 NSTextView、NSTextField 等。
2、显示大图:包裹 NSImageView。
3、显示大视图区域:包裹自定义的 NSView。
4、表格列表滚动:配合 NSTableView 实现表格上下滚动。
使用场景
1、滚动显示完整视图
let scrollView = NSScrollView(frame: NSRect(x: 20, y: 20, width: 300, height: 200))
scrollView.hasVerticalScroller = true
scrollView.hasHorizontalScroller = true
let bigView = NSView(frame: NSRect(x: 0, y: 0, width: 800, height: 600))
bigView.wantsLayer = true
bigView.layer?.backgroundColor = NSColor.red.cgColor
scrollView.documentView = bigView
view.addSubview(scrollView)
因为NSView的尺寸比NSScrollView大,因此可以上下左右滚动显示NSView视图内容。

2、包裹TabView
let tableView = NSTableView()
let scrollView = NSScrollView()
scrollView.documentView = tableView
scrollView.hasVerticalScroller = true
macOS 中很多控件默认不会自动滚动,必须放入 NSScrollView。
常用属性
1、documentView:NSView?类型,实际滚动的内容视图。
2、hasVerticalScroller:Bool类型,是否显示垂直滚动条。
3、hasHorizontalScroller:Bool类型,是否显示水平滚动条。
4、autohidesScrollers:Bool类型,自动隐藏滚动条。
5、borderType:NSBorderType类型,设置边框样式。
6、contentInsets:NSEdgeInsets类型,内边距。
7、drawsBackground:Bool类型,是否绘制背景色。
常见问题
1、内容滚动不了怎么办?
documentView 的尺寸必须大于 NSScrollView 的尺寸才能触发滚动。
2、如何监听滚动?
监听 NSClipView 的 bounds 变化,或用通知:
NotificationCenter.default.addObserver(
self,
selector: #selector(scrolled),
name: NSView.boundsDidChangeNotification,
object: scrollView.contentView
)
总结
NSScrollView可以包裹任何NSView子类,支持手动控制滚动、滚动条样式,很多 AppKit 控件默认依赖它,例如 NSTextView, NSTableView。