macOS 开发-NSView API

3,203 阅读24分钟

NSView用于在应用程序中渲染、打印以及处理事件的基础容器。

概要

通常我们不需要直接使用NSView对象,而是使用其派生的对象或实现的子类并覆盖其方法来实现所需的行为。NSView(或其子类)的实例通常称为视图对象,或简称为视图。

视图可以处理应用程序的展示内容及其交互。视图对象定义了一个矩形区域,用于绘制和接收鼠标事件。视图还可以处理其他琐事,包括拖动图标以及与类一起使用以支持有效的滚动。

NSView该类的大多数功能都是由AppKit自动调用的。除非您NSView在运行时实现视图层次结构的具体子类或与视图层次结构的内容紧密联系,否则您无需了解此类的接口。对于任何视图,可以按原样使用许多方法。通常使用以下方法。

  • frame返回视图的位置和大小。
  • bounds返回视图的内部原点和大小。
  • needsDisplay视图是否需要重绘对象。
  • window返回NSWindow包含该NSView对象的对象。
  • draw(_:)绘制视频对象(所有子类都必须实现此方法,但是很少显式调用它)。

子类化说明

NSView是AppKit中子类化和继承时最重要的类,在Cocoa应用程序中看到的大多数用户界面对象都是继承自的对象NSView。如果您要创建一个以特殊方式绘制自身的对象,或者以一种特殊方式响应鼠标单击的对象,则可以创建的自定义子类NSView(或继承自NSView)。

处理您子类中的事件

如果NSView子类化并处理特定类型的事件时,通常不应调用与事件相关的方法的实现super。视图从NSResponder其父类继承其事件处理功能。响应者的默认行为是将事件传递到响应者链上,如果您在自定义视图中处理事件,这通常不是您想要的行为。因此,如果您的视图实现以下任何方法并处理事件,则不应调用super

  • mouseDown(with:)
  • mouseDragged(with:)
  • mouseUp(with:)
  • mouseMoved(with:)
  • mouseEntered(with:)
  • mouseExited(with:)
  • rightMouseDragged(with:)
  • rightMouseUp(with:)
  • otherMouseDown(with:)
  • otherMouseDragged(with:)
  • otherMouseUp(with:)
  • scrollWheel(with:)
  • keyDown(with:)
  • keyUp(with:)
  • flagsChanged(with:)
  • tabletPoint(with:)
  • tabletProximity(with:)

注意

因为 NSView更改 rightMouseDown:方法的默认行为, 所有在子类化时需要调用super

如果你的视图继承自一个类而不是NSView,调用super让父视图处理任何你不处理的事件。

核心API

创建实例

//初始化对象
init(frame: NSRect)
// 将视图恢复到初始状态,以便可以重用
func prepareForReuse()

管理视图层次结构

// 获取当前视图的父视图
var superview: NSView?
// 当前视图中所有子视图
var subviews: [NSView]
// 视图的窗口对象(如果已安装在窗口中)
var window: NSWindow?
// 将视图添加为指定视图的子视图
func addSubview(NSView)
// 在视图的子视图中插入一个视图,以便将其显示在另一个视图的上方或下方
func addSubview(NSView, positioned: NSWindow.OrderingMode, relativeTo: NSView?)
// 当子视图添加到视图时回调,子类可重写以执行其他操作
func didAddSubview(NSView)
// 从父视图中移除
func removeFromSuperview()
// Unlinks the view from its superview and its window and removes it from the responder chain, but does not invalidate its cursor rectangles to cause redrawing.
func removeFromSuperviewWithoutNeedingDisplay()
// 用另一个视图替换一个视图的子视图
func replaceSubview(NSView, with: NSView)
// 判断视图是不是给定视图的子类
func isDescendant(of: NSView) -> Bool
// 视图最接近的不透明祖先,可能是视图本身
var opaqueAncestor: NSView?
// 返回该视图和另一个指定视图共享的最接近的祖先
func ancestorShared(with: NSView) -> NSView?
// 使用指定的比较器函数对视图的直接子视图进行排序
func sortSubviews((NSView, NSView, UnsafeMutableRawPointer?) -> ComparisonResult, context: UnsafeMutableRawPointer?)
// 通知视图其父视图已更改
func viewDidMoveToSuperview()
// 通知视图它已经被添加到一个新的视图层次结构中。
func viewDidMoveToWindow()
// 通知视图其超级视图即将更改为指定的超级视图(可能为nil)
func viewWillMove(toSuperview: NSView?)
// 通知视图正在将其添加到指定窗口对象的视图层次结构(可能为`nil`)
func viewWillMove(toWindow: NSWindow?)
// 子视图将被删除
func willRemoveSubview(NSView)
// 包含视图或其视图层次结构中的任何超级视图的菜单项
var enclosingMenuItem: NSMenuItem?

修改frame

// 视图的框架矩形,用于定义其在父视图的坐标系中的位置和大小
var frame: NSRect
// 将视图的原点设置为指定点
func setFrameOrigin(NSPoint)
// 将视图设置为指定的尺寸,在其父视图内调整其大小而不影响其坐标系
func setFrameSize(NSSize)
// 旋转角度(以度为单位)应用于相对于其超级视图坐标系的视图
var frameRotation: CGFloat

修改bounds

// 视图的边界矩形,表示其在自己的坐标系中的位置和大小
var bounds: NSRect
// 将视图的边界矩形的原点设置为指定点
func setBoundsOrigin(NSPoint)
// 将视图的边界矩形的大小设置为指定的尺寸
func setBoundsSize(NSSize)
// 旋转角度(以度为单位)
var boundsRotation: CGFloat

管理视图层

// 设置为true时,转换成可支持Layer的视图,即使用一个CALayer对象来管理呈现内容,会隐式地将所有子视图支持该属性
var wantsLayer: Bool
// 指示视图在更新其内容时采用的绘制路径
var wantsUpdateLayer: Bool
// 视图用作其后备存储的核心动画层
var layer: CALayer?
// 创建视图的衬里层
func makeBackingLayer() -> CALayer
// 当前层内容放置策略
var layerContentsPlacement: NSView.LayerContentsPlacement
// 视图层的内容重绘策略
var layerContentsRedrawPolicy: NSView.LayerContentsRedrawPolicy
// 指示视图是否将来自其子视图的内容合并到自己的图层中
var canDrawSubviewsIntoLayer: Bool
// 指示视图的图层是否使用Core Image滤镜并需要进行进程内渲染
var layerUsesCoreImageFilters: Bool
// 可选的图层委托方法,用于处理分辨率更改
protocol NSViewLayerContentScaleDelegate

图层相关属性

// 视图的不透明度
var alphaValue: CGFloat
// 视图围绕其图层中心的旋转角度
var frameCenterRotation: CGFloat
// 一组核心图像滤镜,可应用于视图的背景
var backgroundFilters: [CIFilter]
// 滤镜用于将视图的内容与其背景进行合成
var compositingFilter: CIFilter?
// 一组核心图像滤镜,可应用于视图及其子层的内容
var contentFilters: [CIFilter]
// 视图下方显示阴影
var shadow: NSShadow?

绘制

// 通过修改其基础层来更新视图的内容
func updateLayer()
// 被子类重写以在指定的矩形内绘制视图的图像
func draw(NSRect)
// 指示视图是否可以在后台线程上绘制其内容
var canDrawConcurrently: Bool
// 视图的未被其父视图剪切的部分
var visibleRect: NSRect
// 通过间接返回不重叠矩形的列表,这些列表定义了要求绘制视图的区域draw(_:)
func getRectsBeingDrawn(UnsafeMutablePointer?>?, count: UnsafeMutablePointer?)
// 该值指示指定的矩形是否与要求绘制视图的区域的任何部分相交 
func needsToDraw(NSRect) -> Bool
// 指示AppKit的默认裁剪行为是否有效
var wantsDefaultClipping: Bool
// 返回适合缓存视图的指定部分的位图表示对象
func bitmapImageRepForCachingDisplay(in: NSRect) -> NSBitmapImageRep?
// 将视图的指定区域及其后代绘制到提供的位图表示对象中
func cacheDisplay(in: NSRect, to: NSBitmapImageRep)

打印

// 此操作方法将打开“打印”面板,如果用户选择了“取消”以外的选项,则将视图及其所有子视图打印到“打印”面板中指定的设备上
func printView(Any?)
// 在每个页面的开头调用此方法,以设置坐标系,以便将视图范围内的区域转换为指定位置
func beginPage(in: NSRect, atPlacement: NSPoint)
// 返回在指定矩形内绘制视图区域的EPS数据
func dataWithEPS(inside: NSRect) -> Data
// 返回在指定矩形内绘制视图区域的PDF数据
func dataWithPDF(inside: NSRect) -> Data
// 视图的打印作业标题
var printJobTitle: String
// 包含打印作业标题和日期的默认标题字符串
var pageHeader: NSAttributedString
// 默认的页脚字符串,包括当前页码和页数
var pageFooter: NSAttributedString
// 将EPS数据(其将指定矩形内的视图区域绘制到粘贴板上)写入
func writeEPS(inside: NSRect, to: NSPasteboard)
// 将将指定矩形内的视图区域绘制到粘贴板上的PDF数据写入
func writePDF(inside: NSRect, to: NSPasteboard)
// 允许使用AppKit分页功能的应用程序在每个逻辑页面上绘制其他标记
func drawPageBorder(with: NSSize)

分页

// 在自动分页过程中可以推到下一页的页面的一部分,以防止诸如文本行之类的项目在页面之间划分
var heightAdjustLimit: CGFloat
// 在自动分页过程中可以推到下一页的页面的一部分,以防止诸如小图像或文本列之类的内容在页面之间划分
var widthAdjustLimit: CGFloat
// 由子类重写,以在自动分页期间调整页面宽度
func adjustPageWidthNew(UnsafeMutablePointer, left: CGFloat, right: CGFloat, limit: CGFloat)
// 由子类重写,以在自动分页期间调整页面高度
func adjustPageHeightNew(UnsafeMutablePointer, top: CGFloat, bottom: CGFloat, limit: CGFloat)
// 返回`true`视图是否处理页面边界,`false`否则返回
func knowsPageRange(NSRangePointer) -> Bool
// 由子类实现,以确定要为指定页码打印的视图部分
func rectForPage(Int) -> NSRect
// 调用以确定在物理页面上打印的视图区域的位置
func locationOfPrintRect(NSRect) -> NSPoint

无效视图的内容

// 将指定矩形内的视图区域标记为需要显示,从而增加视图的现有无效区域以将其包括在内
func setNeedsDisplay(NSRect)
// 用于确定视图在显示之前是否需要重绘
var needsDisplay: Bool
// 尽可能显示视图及其所有子视图
func display()
// 充当display(),但将图形限制在视图的矩形区域。
func display(NSRect)
// 显示视图,但将绘图限制在指定的区域,并且不备份到第一个不透明祖先,它仅使视图及其后代执行其绘图代码
func displayIgnoringOpacity(NSRect)
// 使视图及其后代重新绘制到指定的图形上下文
func displayIgnoringOpacity(NSRect, in: NSGraphicsContext)
// 如果视图的任何部分已被标记为需要显示,则显示该视图及其所有子视图
func displayIfNeeded()
// 补充displayIfNeeded,限制在视图的指定区域
func displayIfNeeded(NSRect)
// 补充displayIfNeeded,除了此方法不会备份到第一个不透明祖先-它只是使视图及其后代执行其绘制代码
func displayIfNeededIgnoringOpacity()
// 补充displayIfNeeded,但仅将绘图限制在第一个不透明祖先上,而不是备份到第一个不透明祖先上,它只是使视图及其后代执行其绘图代码
func displayIfNeededIgnoringOpacity(NSRect)                                                                          
// 按指定的增量平移显示矩形
func translateRectsNeedingDisplay(in: NSRect, by: NSSize)
// 指示视图是否用不透明内容填充其框架矩形
var isOpaque: Bool
// 通知视图将要绘制内容
func viewWillDraw()

转换坐标值

// 返回以本地视图坐标表示的后备存储像素对齐的矩形
func backingAlignedRect(NSRect, options: AlignmentOptions) -> NSRect
// 将点从其像素对齐的后备存储坐标系转换为视图的内部坐标系
func convertFromBacking(NSPoint) -> NSPoint
// 将点从视图的内部坐标系转换为其像素对齐的后备存储坐标系
func convertToBacking(NSPoint) -> NSPoint
// 将点从图层的内部坐标系转换为视图的内部坐标系
func convertFromLayer(NSPoint) -> NSPoint
// 将尺寸从视图的内部坐标系转换为图层的内部坐标系
func convertToLayer(NSPoint) -> NSPoint
// 将矩形从其像素对齐的后备存储坐标系转换为视图的内部坐标系
func convertFromBacking(NSRect) -> NSRect
// 将矩形从视图的内部坐标系转换为其像素对齐的后备存储坐标系
func convertToBacking(NSRect) -> NSRect
// 将矩形从图层的内部坐标系转换为视图的内部坐标系
func convertFromLayer(NSRect) -> NSRect
// 将尺寸从视图的内部坐标系转换为图层的内部坐标系
func convertToLayer(NSRect) -> NSRect
// 将尺寸从其像素对齐的后备存储坐标系转换为视图的内部坐标系
func convertFromBacking(NSSize) -> NSSize
// 将尺寸从视图的内部坐标系转换为其像素对齐的后备存储坐标系
func convertToBacking(NSSize) -> NSSize
// 将尺寸从图层的内部坐标系转换为视图的内部坐标系
func convertFromLayer(NSSize) -> NSSize
// 将尺寸从视图的内部坐标系转换为图层的内部坐标系
func convertToLayer(NSSize) -> NSSize
// 将点从给定视图的坐标系转换为视图的坐标系
func convert(NSPoint, from: NSView?) -> NSPoint
// 将点从视图的坐标系转换为给定视图的坐标系
func convert(NSPoint, to: NSView?) -> NSPoint
// 将尺寸从另一个视图的坐标系转换为该视图的坐标系
func convert(NSSize, from: NSView?) -> NSSize
// 将尺寸从视图的坐标系转换为另一个视图的坐标系
func convert(NSSize, to: NSView?) -> NSSize
// 将矩形从另一个视图的坐标系转换为该视图的坐标系
func convert(NSRect, from: NSView?) -> NSRect
// 将矩形从视图的坐标系转换为另一个视图的坐标系
func convert(NSRect, to: NSView?) -> NSRect
// 将指定矩形的角转换为位于设备像素的中心,这在补偿坐标系已缩放时可用于补偿渲染过扫描
func centerScanRect(NSRect) -> NSRect

修改坐标系

// 平移视图的坐标系,以便其原点移动到新位置
func translateOrigin(to: NSPoint)
// 缩放视图的坐标系,以便单位正方形缩放到指定的尺寸
func scaleUnitSquare(to: NSSize)
// 将视图的边界矩形围绕坐标系的原点(0.0,0.0)旋转指定的度值
func rotate(byDegrees: CGFloat)

检查坐标系修改

// 指示视图是否使用翻转的坐标系
var isFlipped: Bool
// 指示视图或其任何祖先是否曾经将旋转因子应用于其框架或边界
var isRotatedFromBase: Bool
// 指示视图或其任何祖先是否曾经将旋转因子应用于其框架或边界,或者是否已从窗口的基本坐标系缩放
var isRotatedOrScaledFromBase: Bool

调整子视图的大小

// 指示当帧大小更改时,视图是否将自动调整大小行为应用于其子视图
var autoresizesSubviews: Bool
// 确定视图如何相对于其父视图调整大小的选项
var autoresizingMask: NSView.AutoresizingMask
// 通知视图的子视图该视图的边界矩形大小已更改
func resizeSubviews(withOldSize: NSSize)
// 通知视图其父视图的边界大小已更改
func resize(withOldSuperviewSize: NSSize)

使用布局锚点创建约束

// 表示视图框架底部边缘的布局锚点
var bottomAnchor: NSLayoutYAxisAnchor
// 表示视图框架水平中心的布局锚点
var centerXAnchor: NSLayoutXAxisAnchor
// 表示视图框架垂直中心的布局锚点
var centerYAnchor: NSLayoutYAxisAnchor
// 布局锚,表示视图中最上方文本的基线
var firstBaselineAnchor: NSLayoutYAxisAnchor
// 表示视图框架高度的布局锚点
var heightAnchor: NSLayoutDimension
// 布局锚,表示视图中最底行的基线
var lastBaselineAnchor: NSLayoutYAxisAnchor
// 表示视图框架前缘的布局锚点。
var leadingAnchor: NSLayoutXAxisAnchor
// 表示视图框架左边缘的布局锚点
var leftAnchor: NSLayoutXAxisAnchor
// 表示视图框架右边缘的布局锚点
var rightAnchor: NSLayoutXAxisAnchor
// 表示视图框架顶部边缘的布局锚点
var topAnchor: NSLayoutYAxisAnchor
// 表示视图框架后沿的布局锚点
var trailingAnchor: NSLayoutXAxisAnchor
// 表示视图框架宽度的布局锚点
var widthAnchor: NSLayoutDimension

约束

// 返回视图持有的约束
var constraints: [NSLayoutConstraint]
// 在接收视图或其子视图的布局上添加约束
func addConstraint(NSLayoutConstraint)
// 在接收视图或其子视图的布局上添加多个约束
func addConstraints([NSLayoutConstraint])
// 从视图中删除指定的约束
func removeConstraint(NSLayoutConstraint)
// 从视图中删除指定的约束
func removeConstraints([NSLayoutConstraint])

使用布局指南

// 将提供的布局指南添加到视图
func addLayoutGuide(NSLayoutGuide)
// 此视图拥有的布局参考对象的数组
var layoutGuides: [NSLayoutGuide]
// 从视图中删除提供的布局指南
func removeLayoutGuide(NSLayoutGuide)

自动布局中的测量

// 满足其约束的视图的最小大小
var fittingSize: NSSize
// 接收视图的自然大小,仅考虑视图本身的属性
var intrinsicContentSize: NSSize
// 使视图的固有内容大小无效
func invalidateIntrinsicContentSize()
// 返回优先级,使视图无法使其小于其固有大小
func contentCompressionResistancePriority(for: NSLayoutConstraint.Orientation) -> NSLayoutConstraint.Priority
// 设置视图拒绝使其小于其固有大小的优先级
func setContentCompressionResistancePriority(NSLayoutConstraint.Priority, for: NSLayoutConstraint.Orientation)
// 返回优先级,使视图无法使其大于其固有大小
func contentHuggingPriority(for: NSLayoutConstraint.Orientation) -> NSLayoutConstraint.Priority
// 设置优先于使视图大于其固有大小的优先级
func setContentHuggingPriority(NSLayoutConstraint.Priority, for: NSLayoutConstraint.Orientation)

使视图与自动布局对齐

// 返回给定框架的视图对齐矩形
func alignmentRect(forFrame: NSRect) -> NSRect
// 返回给定对齐矩形的视图框架
func frame(forAlignmentRect: NSRect) -> NSRect
// 视图框架的插入点(以磅为单位),用于定义其内容矩
var alignmentRectInsets: NSEdgeInsets// 视图的对齐矩形的底部与其基线之间的距离(以磅为单位)
var baselineOffsetFromBottom: CGFloat
// 视图的对齐矩形的顶部与其最高基线之间的距离(以磅为单位)
var firstBaselineOffsetFromTop: CGFloat
// 视图的对齐矩形的底部与其最底端的基线之间的距离(以磅为单位)
var lastBaselineOffsetFromBottom: CGFloat

触发自动布局

// 指示视图在绘制之前是否需要布局传递
var needsLayout: Bool
// 与基于约束的布局系统一起执行布局
func layout()
// 根据当前视图和约束更新接收视图及其子视图的布局
func layoutSubtreeIfNeeded()
// 指示是否需要更新视图的约束
var needsUpdateConstraints: Bool
// 更新视图的约束
func updateConstraints()
// 更新接收视图及其子视图的约束
func updateConstraintsForSubtreeIfNeeded()

选择加入自动版式

// 该值指示视图是否依赖于基于约束的布局系统
class var requiresConstraintBasedLayout: Bool
// 指示是否将视图的自动调整大小蒙版转换为基于约束的布局系统的约束
var translatesAutoresizingMaskIntoConstraints: Bool

焦点

// 将焦点锁定在视图上,因此后续命令将在视图的窗口和坐标系中生效
func lockFocus()
// 如果方法返回并返回的值,则将焦点自动锁定到视图
func lockFocusIfCanDraw() -> Bool
// 如果可以在指定的图形上下文中进行绘制,则将焦点自动锁定在视图上
func lockFocusIfCanDraw(in: NSGraphicsContext) -> Bool
// 从当前视图解锁焦点
func unlockFocus()
// 返回当前聚焦的NSView对象
class var focusView: NSView?

聚焦环图

// 围绕视图绘制的聚焦环的类型
var focusRingType: NSFocusRingType
// 聚焦环蒙版边界,在视图的坐标空间中指定
var focusRingMaskBounds: NSRect
// 为视图绘制聚焦环蒙版
func drawFocusRingMask()
// 调用以通知视图聚焦环蒙版需要更新
func noteFocusRingMaskChanged()
// 使聚焦环周围的区域无效
func setKeyboardFocusRingNeedsDisplay(NSRect)
// 返回默认的对焦环类型  
class var defaultFocusRingType: NSFocusRingType

获取充满活力的设置

// Query allowsVibrancy to see if the given appearance actually needs vibrant drawing. You may want to draw differently if the current apperance is vibrant.
var allowsVibrancy: Bool

全屏模式

// 将视图设置为全屏模式
func enterFullScreenMode(NSScreen, withOptions: [NSView.FullScreenModeOptionKey : Any]?) -> Bool
// 指示视图退出全屏模式
func exitFullScreenMode(options: [NSView.FullScreenModeOptionKey : Any]?)
// 视图是否处于全屏模式
var isInFullScreenMode: Bool

隐藏视图

// 指示视图是否隐藏
var isHidden: Bool
// 指示该视图或它的祖先之一是否被视线隐藏了,被标记为隐藏
var isHiddenOrHasHiddenAncestor: Bool
// 视图被隐藏时直接调用,或者响应于祖先被隐藏而调用
func viewDidHide()
// 视图被取消隐藏时直接调用,或响应于取消隐藏祖先而调用
func viewDidUnhide()

管理实时调整大小

// 指示是否将视图作为实时调整大小操作的一部分进行渲染
var inLiveResize: Bool
// 指示视图是否通过保留未移动的内容来优化实时调整大小的操作
var preservesContentDuringLiveResize: Bool
// 返回指示视图新暴露区域的矩形列表
func getRectsExposedDuringLiveResize(UnsafeMutablePointer, count: UnsafeMutablePointer)
// 矩形,用于标识视图的实时调整大小操作期间未更改的部分
var rectPreservedDuringLiveResize: NSRect
// 通知视图实时调整大小的开始-用户已开始调整视图的大小
func viewWillStartLiveResize()
// 通知视图实时调整大小结束-用户已完成视图大小的调整
func viewDidEndLiveResize()

管理手势识别器

// 识别当前附加到视图的手势对象
var gestureRecognizers: [NSGestureRecognizer]
// 将手势识别器附加到视图
func addGestureRecognizer(NSGestureRecognizer)
// 从视图中分离手势识别器
func removeGestureRecognizer(NSGestureRecognizer)

事件处理

// 类重写mouseDown(:)返回true,如果不是,则为false
func acceptsFirstMouse(for: NSEvent?) -> Bool
// 返回包含指定点的视图层次结构中视图的最远后代(包括自身),或者返回`nil`该点是否完全位于视图外部。
func hitTest(NSPoint) -> NSView?
// 返回视图的区域是否包含指定点,说明视图是否翻转
func isMousePoint(NSPoint, in: NSRect) -> Bool
// 由子类实现以响应等效的键(也称为键盘快捷键)
func performKeyEquivalent(with: NSEvent) -> Bool
// 指示视图是否可以将鼠标按下事件传递给其超级视图
var mouseDownCanMoveWindow: Bool
// 视图的文本输入上下文对象
var inputContext: NSTextInputContext?

触摸事件处理

// 视图是否接受触摸事件。默认为false
var acceptsTouchEvents: Bool

Key View

// 指示视图是否可以成为关键视图
var canBecomeKeyView: Bool
// 指示视图在处理键盘输入和导航之前是否需要其面板成为键窗口
var needsPanelToBecomeKey: Bool
// 关键视图循环中当前视图之后的视图对象
var nextKeyView: NSView?
// 关键视图循环中最接近的视图对象,该对象紧随关键视图循环中的当前视图并接受第一响应者状态
var nextValidKeyView: NSView?
// 关键视图循环中当前视图之前的视图对象
var previousKeyView: NSView?
// 关键视图循环中最接近的视图对象,该对象位于当前视图之前并接受第一响应者状态
var previousValidKeyView: NSView?

Scrolling

// 准备用于绘制的透支区域
func prepareContent(in: NSRect)
// 视图的已渲染部分,可用于响应滚动
var preparedContentRect: NSRect
// 滚动视图的最接近的祖先对象,以使视图中的点位于剪辑视图的边界矩形的原点
func scroll(NSPoint)
// 滚动视图的最接近的祖先对象所需的最小距离,以使视图的指定区域在剪辑视图中可见
func scrollToVisible(NSRect) -> Bool
// 按与视图外部最近的事件的距离成比例地滚动视图的祖先对象
func autoscroll(with: NSEvent) -> Bool
// 被子类重写以修改给定的矩形,并返回更改后的矩形
func adjustScroll(NSRect) -> NSRect
// 包含当前视图的最接近的祖先滚动视图
var enclosingScrollView: NSScrollView?
// 通知剪辑视图的超级视图剪辑视图需要重置其边界矩形的原点
func scroll(NSClipView, to: NSPoint)
// 通知剪辑视图的超级视图剪辑视图的边界矩形或文档视图的框架矩形已更改,并且滚动位置的任何指示符都需要调整
func reflectScrolledClipView(NSClipView)

拖动操作

// 注册视图将接受的粘贴板类型作为图像拖动会话的目标
func registerForDraggedTypes([NSPasteboard.PasteboardType])
// 在拖动会话中将视图注销为可能的目标
func unregisterDraggedTypes()
// 视图可以接受的粘贴板拖动类型的数组
var registeredDraggedTypes: [NSPasteboard.PasteboardType]
// 使用一组拖动项启动拖动会话
func beginDraggingSession(with: [NSDraggingItem], event: NSEvent, source: NSDraggingSource) -> NSDraggingSession
// 从视图启动拖动操作,从而允许用户将文件图标拖动到具有窗口或查看接受文件的对象的任何应用程序
func dragFile(String, from: NSRect, slideBack: Bool, event: NSEvent) -> Bool
// 从视图启动拖动操作,从而允许用户将一个或多个承诺文件(或目录)拖动到任何具有接受承诺文件数据的窗口或视图对象的应用程序中
func dragPromisedFiles(ofTypes: [String], from: NSRect, source: Any, slideBack: Bool, event: NSEvent) -> Bool
// 允许用户在不激活应用程序或不向前移动视图窗口的情况下从视图中拖动对象,从而可能使目标模糊
func shouldDelayWindowOrdering(for: NSEvent) -> Bool

处理智能放大倍数

// 返回在指定点周围放大时要使用的适当矩形
func rectForSmartMagnification(at: NSPoint, in: NSRect) -> NSRect

控制通知

// 指示视图的框架矩形更改时是否发布通知
var postsFrameChangedNotifications: Bool
// 指示视图的边界矩形更改时是否发布通知
var postsBoundsChangedNotifications: Bool

响应后备存储库属性的更改

// 视图的后备存储库属性更改时响应
func viewDidChangeBackingProperties()

标签

// 返回带有特定标签或`nil`没有子视图具有该标签的视图的最接近后代(包括其自身)
func viewWithTag(Int) -> NSView?
// 视图的标记,它是一个整数,用于在应用程序中标识视图
var tag: Int

工具提示

// 为视图的已定义区域创建工具提示,并返回标识工具提示矩形的标签
func addToolTip(NSRect, owner: Any, userData: UnsafeMutableRawPointer?) -> NSView.ToolTipTag
// 删除分配给视图的所有工具提示
func removeAllToolTips()
// 删除由指定标签标识的工具提示
func removeToolTip(NSView.ToolTipTag)
// 视图工具提示的文本
var toolTip: String?

管理跟踪矩形

// 在视图中建立一个用于跟踪鼠标输入和鼠标退出事件的区域,并返回一个标识跟踪矩形的标记
func addTrackingRect(NSRect, owner: Any, userData: UnsafeMutableRawPointer?, assumeInside: Bool) -> NSView.TrackingRectTag
// 删除标记标识的跟踪矩形
func removeTrackingRect(NSView.TrackingRectTag)

管理跟踪区域

// 将给定的跟踪区域添加到视图中
func addTrackingArea(NSTrackingArea)
// 从视图中删除给定的跟踪区域
func removeTrackingArea(NSTrackingArea)
// 视图的跟踪区域的数组
var trackingAreas: [NSTrackingArea]
// 视图的几何形状发生变化时自动调用,从而需要重新计算其跟踪区域
func updateTrackingAreas()

管理光标跟踪

// 建立当鼠标指针位于指定区域内时要使用的光标
func addCursorRect(NSRect, cursor: NSCursor)
// 从视图中完全删除光标矩形
func removeCursorRect(NSRect, cursor: NSCursor)
// 使使用设置的所有光标矩形无效
func discardCursorRects()
// 子类重写以定义其默认光标矩形
func resetCursorRects()

管理上下文菜单

// 子类重写,以为给定的鼠标按下事件返回上下文相关的弹出菜单
func menu(for: NSEvent) -> NSMenu?
// 被子类重写,以为接收类的实例返回默认的弹出菜单
class var defaultMenu: NSMenu?
// 在屏幕上打开视图的上下文菜单之前调用
func willOpenMenu(NSMenu, with: NSEvent)
// 从接收视图显示的上下文菜单关闭后调用
func didCloseMenu(NSMenu, with: NSEvent?)

编写符合标准的渲染说明

// 在打印会话开始时调用此方法,以设置当前图形上下文
func beginDocument()
// 在打印会话结束时调用此方法
func endDocument()
// 写入符合要求的页面的结尾
func endPage()

显示定义窗口

// 显示一个窗口,该窗口在指定点显示属性字符串的定义
func showDefinition(for: NSAttributedString?, at: NSPoint)
// 显示一个窗口,该窗口显示属性字符串的指定范围的定义
func showDefinition(for: NSAttributedString?, range: NSRange, options: [NSView.DefinitionOptionKey : Any]?, baselineOriginProvider: ((NSRange) -> NSPoint)?)
// 要包含在定义中的键
struct NSView.DefinitionOptionKey
// 窗口的演示选项
struct NSView.DefinitionPresentationType

图纸查找指示器

// 指示是否正在为查找指示器绘制视图或其祖先之一
var isDrawingFindIndicator: Bool

管理内容布局方向

// 视图中内容的布局方向
var userInterfaceLayoutDirection: NSUserInterfaceLayoutDirection

配置压力

// 在光标位于视图上方时响应用户产生的触摸输入时,配置Force Touch触控板的行为和进度
var pressureConfiguration: NSPressureConfiguration?

通知事项

// 当视图的bounds矩形独立于框架矩形而更改为新值时(但仅当视图的属性为时)才发布
class let boundsDidChangeNotification: NSNotification.Name
// 当视图的框架矩形更改为新值时才发布,但仅当视图的属性为时才发布。
class let frameDidChangeNotification: NSNotification.Name
// 当视图重新计算其跟踪区域时发布。
class let didUpdateTrackingAreasNotification: NSNotification.Name

实例属性

var allowedTouchTypes: NSTouch.TouchTypeMask
var candidateListTouchBarItem: NSCandidateListTouchBarItem?
var isHorizontalContentSizeConstraintActive: Bool
var isVerticalContentSizeConstraintActive: Bool
var playgroundLiveViewRepresentation: PlaygroundLiveViewRepresentation

实例方法

// 通知客户端,aRulerView允许用户添加aMarker
func rulerView(NSRulerView, didAdd: NSRulerMarker)
// 通知客户端,aRulerView允许用户移动aMarker。
func rulerView(NSRulerView, didMove: NSRulerMarker)
// 通知客户端,aRulerView允许用户移除aMarker。
func rulerView(NSRulerView, didRemove: NSRulerMarker)
// 当光标位于aRulerView的标尺区域时,通知客户端用户已按下鼠标按钮。
func rulerView(NSRulerView, handleMouseDownWith: NSEvent)
func rulerView(NSRulerView, locationFor: NSPoint) -> CGFloat
func rulerView(NSRulerView, pointForLocation: CGFloat) -> NSPoint
// 请求aRulerView添加aMarker(一个被用户拖到标尺上的NSRulerMarker)的权限。
func rulerView(NSRulerView, shouldAdd: NSRulerMarker) -> Bool
// 请求允许aRulerView移动aMarker。
func rulerView(NSRulerView, shouldMove: NSRulerMarker) -> Bool
// 请求aRulerView删除aMarker的权限。
func rulerView(NSRulerView, shouldRemove: NSRulerMarker) -> Bool
// 通知客户端aRulerView将添加新的NSRulerMarker, aMarker。
func rulerView(NSRulerView, willAdd: NSRulerMarker, atLocation: CGFloat) -> CGFloat
// 通知客户端aRulerView将移动aMarker,一个已经在标尺视图上的NSRulerMarker。
func rulerView(NSRulerView, willMove: NSRulerMarker, toLocation: CGFloat) -> CGFloat
// 通知客户端视图将被采纳
func rulerView(NSRulerView, willSetClientView: NSView)
func viewDidChangeEffectiveAppearance()

更多内容,欢迎注我的公众号:

我的公众号