Mac 데스크톱에 흩어져 있는 아이콘을 일시적으로 숨기는 앱 만들어 보았다
8469 단어 MacOSX
소개
macOS의 네이티브 애플리케이션을 잘 만드는데 앱 심사 신청을 위해 스크린샷을 찍을 때 매번 데스크톱을 깨끗하게 하는 것이 귀찮았습니다. 그래서 데스크톱을 일시적으로 깨끗하게 보여주는 앱을 살짝 만들어 보았습니다.
완성하고 「했어ー」라고 생각하면, 완전히 같은 기능을 가진 앱이 AppStore에서 전달되고 있었습니다 orz... HiddenMe 라고 하는 앱입니다. 멀티 디스플레이 대응으로 하려면 과금이 필요 같네요.
아티팩트
GitHub에 소스와 .dmg
다운로드 링크가 있습니다.
htps : // 기주 b. 코 m / 쿄메 22 / 세크 t에서 sk와 p
메뉴 바에 상주하는 아이콘에서 Hide Desktop
를 눌러 토글 할 수 있습니다. 기본적으로 멀티 디스플레이를 지원합니다.
동작 확인하는 것이 귀찮았기 때문에 .dmg
에서의 배포판은 macOS Mojave 10.14
이상에서 밖에 움직이지 않습니다. Mojave 이하로 이동하고 싶은 사람은 GitHub에서 소스 다운로드하여 타겟 버전을 낮추어보십시오.
포인트
요점은 아이콘의 한 장 위의 레이어에 NSImageView
로 배경의 이미지를 붙여 숨기고 있을 뿐입니다만, 배경 이미지를 가져오는 곳의 Tips가 적어 구현 귀찮았습니다.
Extensions.swiftextension NSImage {
static func desktopPicture(targetPoint: CGPoint) -> NSImage? {
guard let rawList: NSArray = CGWindowListCopyWindowInfo(.optionOnScreenOnly, kCGNullWindowID) else {
return nil
}
var windowList = rawList as! [NSDictionary]
windowList = windowList.filter { (data) -> Bool in
if let owner = data[kCGWindowOwnerName] as? String, owner == "Dock" {
if let name = data[kCGWindowName] as? String, name.contains("Desktop Picture") {
return true
}
}
return false
}
for window in windowList {
let bounds = window[kCGWindowBounds] as! NSDictionary
let X = bounds["X"] as! CGFloat
let Y = bounds["Y"] as! CGFloat
let W = bounds["Width"] as! CGFloat
let H = bounds["Height"] as! CGFloat
let rect = CGRect(x: X, y: Y, width: W, height: H)
if rect.contains(targetPoint) {
let id = window[kCGWindowNumber] as! UInt32
guard let cgImage = CGWindowListCreateImage(rect, .optionIncludingWindow, id, .boundsIgnoreFraming) else {
break
}
let nsImage = NSImage(cgImage: cgImage, size: rect.size)
nsImage.resizingMode = NSImage.ResizingMode.stretch
return nsImage
}
}
return nil
}
}
CGWindowListCopyWindowInfo
라고 하는 것으로부터 감싸는 식에 데스크탑의 Window
의 정보를 뽑아 오고 있습니다.
그리고 아이콘의 한 장 위에 있는 레이어에 NSWindow
를 배치한다는 것은 이런 느낌으로 했습니다.self.window!.level = NSWindow.Level(Int(CGWindowLevelForKey(CGWindowLevelKey.normalWindow)) - 1)
일반 응용 프로그램의 Window를 배치해야 할 레이어의 한 계층 아래에 배치합니다.
Reference
이 문제에 관하여(Mac 데스크톱에 흩어져 있는 아이콘을 일시적으로 숨기는 앱 만들어 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Kyome/items/c078edffae30e651ad7c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
GitHub에 소스와
.dmg
다운로드 링크가 있습니다.htps : // 기주 b. 코 m / 쿄메 22 / 세크 t에서 sk와 p
메뉴 바에 상주하는 아이콘에서
Hide Desktop
를 눌러 토글 할 수 있습니다. 기본적으로 멀티 디스플레이를 지원합니다.동작 확인하는 것이 귀찮았기 때문에
.dmg
에서의 배포판은 macOS Mojave 10.14
이상에서 밖에 움직이지 않습니다. Mojave 이하로 이동하고 싶은 사람은 GitHub에서 소스 다운로드하여 타겟 버전을 낮추어보십시오.포인트
요점은 아이콘의 한 장 위의 레이어에 NSImageView
로 배경의 이미지를 붙여 숨기고 있을 뿐입니다만, 배경 이미지를 가져오는 곳의 Tips가 적어 구현 귀찮았습니다.
Extensions.swiftextension NSImage {
static func desktopPicture(targetPoint: CGPoint) -> NSImage? {
guard let rawList: NSArray = CGWindowListCopyWindowInfo(.optionOnScreenOnly, kCGNullWindowID) else {
return nil
}
var windowList = rawList as! [NSDictionary]
windowList = windowList.filter { (data) -> Bool in
if let owner = data[kCGWindowOwnerName] as? String, owner == "Dock" {
if let name = data[kCGWindowName] as? String, name.contains("Desktop Picture") {
return true
}
}
return false
}
for window in windowList {
let bounds = window[kCGWindowBounds] as! NSDictionary
let X = bounds["X"] as! CGFloat
let Y = bounds["Y"] as! CGFloat
let W = bounds["Width"] as! CGFloat
let H = bounds["Height"] as! CGFloat
let rect = CGRect(x: X, y: Y, width: W, height: H)
if rect.contains(targetPoint) {
let id = window[kCGWindowNumber] as! UInt32
guard let cgImage = CGWindowListCreateImage(rect, .optionIncludingWindow, id, .boundsIgnoreFraming) else {
break
}
let nsImage = NSImage(cgImage: cgImage, size: rect.size)
nsImage.resizingMode = NSImage.ResizingMode.stretch
return nsImage
}
}
return nil
}
}
CGWindowListCopyWindowInfo
라고 하는 것으로부터 감싸는 식에 데스크탑의 Window
의 정보를 뽑아 오고 있습니다.
그리고 아이콘의 한 장 위에 있는 레이어에 NSWindow
를 배치한다는 것은 이런 느낌으로 했습니다.self.window!.level = NSWindow.Level(Int(CGWindowLevelForKey(CGWindowLevelKey.normalWindow)) - 1)
일반 응용 프로그램의 Window를 배치해야 할 레이어의 한 계층 아래에 배치합니다.
Reference
이 문제에 관하여(Mac 데스크톱에 흩어져 있는 아이콘을 일시적으로 숨기는 앱 만들어 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Kyome/items/c078edffae30e651ad7c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
extension NSImage {
static func desktopPicture(targetPoint: CGPoint) -> NSImage? {
guard let rawList: NSArray = CGWindowListCopyWindowInfo(.optionOnScreenOnly, kCGNullWindowID) else {
return nil
}
var windowList = rawList as! [NSDictionary]
windowList = windowList.filter { (data) -> Bool in
if let owner = data[kCGWindowOwnerName] as? String, owner == "Dock" {
if let name = data[kCGWindowName] as? String, name.contains("Desktop Picture") {
return true
}
}
return false
}
for window in windowList {
let bounds = window[kCGWindowBounds] as! NSDictionary
let X = bounds["X"] as! CGFloat
let Y = bounds["Y"] as! CGFloat
let W = bounds["Width"] as! CGFloat
let H = bounds["Height"] as! CGFloat
let rect = CGRect(x: X, y: Y, width: W, height: H)
if rect.contains(targetPoint) {
let id = window[kCGWindowNumber] as! UInt32
guard let cgImage = CGWindowListCreateImage(rect, .optionIncludingWindow, id, .boundsIgnoreFraming) else {
break
}
let nsImage = NSImage(cgImage: cgImage, size: rect.size)
nsImage.resizingMode = NSImage.ResizingMode.stretch
return nsImage
}
}
return nil
}
}
Reference
이 문제에 관하여(Mac 데스크톱에 흩어져 있는 아이콘을 일시적으로 숨기는 앱 만들어 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Kyome/items/c078edffae30e651ad7c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)