使NSWindow.isMovableByWindowBackground与NSTextField一起使用

时间:2017-09-16 10:18:06

标签: cocoa nswindow nstextfield appkit

我有一个Cocoa应用程序显示"快速搜索"窗口类似于Spotlight。该窗口包含一个视觉效果视图,位于NSTextField内。文本字段在窗口的整个宽度上延伸。

我希望能够通过拖动文本字段的空白区域来移动窗口。在文本字段中拖动文本时,应该使用正常的编辑(即选择)行为。

理论上,按窗口移动窗口很容易:

window.isMovableByWindowBackground = true

但是,此行为不适用于NSTextField,因为它会拦截拖动并尝试选择文本。

Spotlight以某种方式做到了。这是一个例子:

Spotlight example

我认为没有成功的几个选项:

  • 尝试覆盖hitTest:返回nil
  • 尝试覆盖mouseDown|Up|Dragging:并转发至superview
  • 尝试使用autolayout让文本字段缩小以紧紧包裹其文本(无法想出这一点)

1 个答案:

答案 0 :(得分:3)

作为参考,我终于找到了一种方法:

第1部分:让NSTextField以其内容增长/缩小

覆盖intrinsicContentSize并衡量其内容:

private func measure(_ string:NSAttributedString) -> NSSize
{
    let cell = NSTextFieldCell(textCell: stringValue)
    cell.attributedStringValue = string

    return cell.cellSize
}

第2部分:视图设置

  • 在文本字段
  • 之后添加占位符视图
  • 设置自动布局以使占位符视图增长和缩小

第3部分:所有细节

  • 设置占位符视图以使用iBeam光标使其显示为文本字段
  • 如果用户点击占位符视图,请将文本字段设为第一个响应者

那就是它。