Roy的个人站

樵夫的小站

马上订阅 Roy的个人站 RSS 更新: https://geofftools.cn/blog/atom.xml

MacOS在NSImage里提供了哪些系统图标

2020年7月22日 09:01

近两周闲下来的时间都在写一个新的App,都没时间写字和写文章。昨天美工大哥问了我一个问题,MacOS到底有哪些系统图标可用?图标文件夹的确是一个解决方案,但保证可用还是得额外加进项目的素材库,和外加的图标没有区别。真的内置的图标的话,这个问题换句话说是NSImage.Name里面到底有哪些图标。本文用看着也越来越重要的SwiftUI,抓取开发者文档的数据展示可用的图标和尺寸。

已有资料

开发者文档里有专门的一页,列出了目前可用的系统图标。但只有名字,没有相应的图片放在边上,也看不到尺寸。

github上发现了一个项目,可惜几年不更新了,图标数据也是写死在代码里的。项目名字叫fucking_nsimage_syntax,不知道是不是也在吐槽开发者文档里不放图和尺寸。

如果自己写一个的话,基本是,网页抓取数据->数据对应图标和尺寸->SwiftUI展示,也很简单。

数据抓取

开发者文档载入是先框架后数据,简单看一下包,可以找到图标页的数据通过获取这一个网址取得:

1
https://developer.apple.com/tutorials/data/documentation/appkit/nsimage/name.json

既然已经想好SwiftUI展示,那就直接做进界面的方法里好了,这里就是一个简单的网页请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
extension ImageNameDemoView {
func getImages(callback: @escaping ([String]) -> Void) {
let url = URL(string: "https://developer.apple.com/tutorials/data/documentation/appkit/nsimage/name.json")!
let task = URLSession.shared.dataTask(with: url) { d, _, _ in
guard let d = d else { return }
if let r = try? JSONSerialization.jsonObject(with: d, options: .mutableContainers) {
if let refs = (r as! [String: Any])["references"] {
var rl = [String]()
for v in (refs as! [String: Any]).values {
let n = (v as! [String: Any])["title"] as! String
if n.hasSuffix("Name") {
rl.append(n)
}
}
callback(rl)
}
}
}
task.resume()
}
}

我们要的数据全都在references键里,通过判断后缀是否有Name去除非图标的内容。

数据对应图标和尺寸

这里获取了需要的数据的数组,但这个数据只是属性名不是实际的值,所以还需要一个转化。

理论上来说这是个很简单的过程,想象中通过value(forKey:)就可以解决。但NSImage现在还不是正常实现的类,所以这个方法和同理的反射都不能用。

这里是可以OC去取值的,但实际上取巧的办法就可行:

1
2
3
4
5
6
7
extension ImageNameDemoView {
func getNSImageName(_ s: String) -> String {
var r = "NS\(s.prefix(1).capitalized)\(s.suffix(s.count - 1).prefix(s.count - 5))"
if r == NSImage.applicationIconName { r = ""...

剩余内容已隐藏

查看完整文章以阅读更多