雨燕(4.0)接受答案的版本基本相同:
let yellowView: NSView // your view that contains the point with the yellow arrow.
let yellowPoint = NSPoint(x: 100, y: 100)
let pointInWindow = yellowView.convert(yellowPoint, to: nil)
let pointOnScreen = yellowView.window?.convertToScreen(NSRect(origin: pointInWindow, size: .zero)).origin ?? .zero
let contentRect = NSRect(origin: pointOnScreen, size: NSSize(width: 32, height: 32))
let newWindow = NSWindow(contentRect: contentRect, styleMask: ...)
以下是做到這一點的另一種方法:
let someView: NSView // Some existing view
var rect: NSRect
rect = NSRect(x: 100, y: 100, width: 0, height: 0)
rect = someView.convert(rect, to: nil)
rect = someView.window?.convertToScreen(rect) ?? rect
rect.size = NSSize(width: 32, height: 32)
let newWindow = NSWindow(contentRect: rect, styleMask: ...)
後一種方法只是提前設定好直線。以下是喜歡漫遊的玩家:
1.創建一個矩形。在視圖座標系中的所需位置初始化一個零大小的矩形。
let someView: NSView // Some existing view
var rect = NSRect(x: 100, y: 100, width: 0, height: 0)
2.將視圖轉換爲窗口。通過爲目標view
指定nil
將矩形從視圖的座標系轉換爲窗口座標系。
rect = someView.convert(rect, to: nil)
3.從窗口轉換到屏幕。接下來,將矩形從窗口的座標系轉換到屏幕的座標系。
注意someView.window
可能nil
,所以我們使用可選的鏈接(即window?
的?
)和後備的rect
原來的值,如果是這樣的話。這可能沒有必要,但這是一個很好的習慣。
rect = someView.window?.convertToScreen(rect) ?? rect
4.設置矩形的大小。更新所需大小的新窗口的矩形。
rect.size = NSSize(width: 32, height: 32)
5.創建窗口。用轉換後的矩形初始化一個新窗口。
let newWindow = NSWindow(contentRect: rect, styleMask: ...)
親愛的尼古拉,請您提供一個Swift解決方案。我無法翻譯你的答案。 – ixany
@ixany我在下面添加了一個Swift等價物。 –