我正在尝试创建放大视图,但有一些无法理解的问题。我有NSWindow
那个包含NSImageView
. 当我将静态原点位置设置为窗口并仅移动光标(鼠标)时,一切都很好。但是当我从鼠标位置将原点设置为窗口时,图像非常模糊。
在 image.addRepresentation(bitmap) 中,我按预期接收到正常图像(已在调试器上检查)。同样在调试模式下,我看到捕获的图像在鼠标移动时从正常快速缩放到巨大。
有什么建议么?
NS窗口:
class ColorPickerWindow: NSWindow {
private let colorPickerMagnifier: ColorPickerMagnifier!
override init(contentRect: NSRect, styleMask style: NSWindow.StyleMask, backing backingStoreType: NSWindow.BackingStoreType, defer flag: Bool) {
self.colorPickerMagnifier = ColorPickerMagnifier()
let location = NSEvent.mouseLocation
super.init(contentRect: NSRect(x: 0, y: 0, width: 120, height: 120),
styleMask: [],
backing: .buffered,
defer: true)
self.backgroundColor = .clear
self.level = .floating + 1000
self.makeKeyAndOrderFront(self)
self.isMovableByWindowBackground = false
self.isOpaque = false
self.hasShadow = false
NSEvent.addLocalMonitorForEvents(matching: .mouseMoved) { (event) -> NSEvent in
let location = NSEvent.mouseLocation
self.updatePickerLocation(location: location)
print(location)
return event
}
self.colorPickerMagnifier.frame = self.contentView!.bounds
self.contentView?.addSubview(self.colorPickerMagnifier)
self.updatePickerLocation(location: location)
}
// MARK: - Private
private func updatePickerLocation(location: CGPoint) {
self.updatePickerImage(from: location)
self.setFrameOrigin(NSPoint(x: location.x - self.contentView!.frame.width / 2, y: location.y - self.contentView!.frame.height / 2))
}
private func updatePickerImage(from location: CGPoint) {
let magnifySize = CGFloat(8)
let x = floor(location.x) - floor(magnifySize / 2)
let y = (NSScreen.main?.frame)!.size.height - floor(location.y) - floor(magnifySize / 2)
let captureRect = CGRect(x: x, y: y, width: magnifySize, height: magnifySize)
guard let cgImageFromScreen = CGWindowListCreateImage(captureRect, .optionOnScreenAboveWindow, .zero, .bestResolution) else {
return
}
let bitmap = NSBitmapImageRep(cgImage: cgImageFromScreen)
let image = NSImage()
image.addRepresentation(bitmap)
self.colorPickerMagnifier.image = image
}
}
NSImageView:
class ColorPickerMagnifier: ImageViewDeInterpolated {
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
self.imageScaling = .scaleProportionallyUpOrDown
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
}
}