【发布时间】:2017-11-25 23:49:37
【问题描述】:
我一直在努力解决这个非常令人沮丧的问题,希望有人能提供帮助。我正在尝试创建一个具有多个视图的 NSWindow。这些视图可以相互重叠。这些是要求。
- 下图中蓝色的 NSView 是可以移动窗口的。
- 黄色的 NSView 无法移动窗口。这是蓝色 NSView 下方的另一个 NSView 实例。
- 该运动需要与任何其他窗口运动一样。
- 将窗口一直拖到顶部等操作应该会激活 Expose(Sierra 和 High Sierra)。
第一次尝试
我尝试了以下方法。不幸的是,这根本行不通。
在 NSWindow 中
override func awakeFromNib() {
self.refreshElements()
self.titlebarAppearsTransparent = true
self.isMovableByWindowBackground = true
}
在我的自定义视图中
class Blue: NSView {
public override var mouseDownCanMoveWindow: Bool { return true }
}
class Yellow: NSView {
public override var mouseDownCanMoveWindow: Bool { return false }
}
第二次尝试
然后我尝试在蓝色中实现 mouseDown mouseDragged 和 mouseUp。我会计算窗口上的鼠标移动和self.setFrame(frameRect:display:animate:)。这工作正常,因为我可以控制移动窗口,但它有几个问题。一个不管是什么窗口的移动总是比较慢。我认为即使我将animate 属性设置为false,它也是动画。它也不会像其他窗口那样激活 Expose。
第三次尝试
这是我在一个主要问题上所能达到的最接近我想要的行为。初始 mouseDown 未注册。所以你不能点击蓝色视图并拖动和移动窗口。你有 mouseDown,mouseUp,然后 mouseDown 再次为了拖动移动窗口。
public class MyWindow: NSWindow {
@IBOutlet var blue: NSView!
@IBOutlet var yellow: NSView!
public override func awakeFromNib() {
self.titlebarAppearsTransparent = true
self.isMovable = false
self.isMovableByWindowBackground = true
}
public override func mouseDown(with event: NSEvent) {
let point = event.locationInWindow
let move = NSPointInRect(point, self.blue.frame)
self.isMovableByWindowBackground = move
self.isMovable = move
super.mouseDown(with: event)
}
public override func mouseDragged(with event: NSEvent) {
super.mouseDragged(with: event)
}
}
我首选的方法是方法 3。它是最简洁的代码,除了必须单击然后再次单击以使事情正常工作的异常行为之外,其他一切都是完美的。我的问题是如何在动态设置为允许移动后强制初始点击也注册到窗口?
【问题讨论】:
标签: cocoa