Finder会将Alias
和symlink
的图标显示为带有小箭头的文件夹。
我目前使用以下内容获取显示图标。
[[NSWorkspace sharedWorkspace] iconForFile:[item fullPath]]
这会将Alias的图标显示为带有小箭头的文件夹,但将符号链接显示为普通文件夹。
我假设OSX正在使用AliasBadgeIcon.icns
合成图标,但为什么它不适用于符号链接。
两者都显示Kind为Alias。
有没有办法获取符号链接的复合词?
我可能用CALayer
构建自己的(看起来很复杂)。我欢迎任何更简单的建议。
答案 0 :(得分:1)
别名和符号链接行为差异的可能原因是许多低级别(POSIX / BSD)API会自动解析符号链接,而别名则不会。它可能是NSWorkspace
中的一个错误,它获取了符号链接目标的图像而不是符号链接本身,而不是简单的忽略,以便特别避免。
我目前无法进行测试,但如果您可以将部署目标定位到10.10及更高版本,则可以尝试使用:
NSImage* icon;
if ([someURL getResourceValue:&icon forKey:NSURLThumbnailKey error:NULL])
/* make use of icon */;
可能会更明智地提及指向符号链接的网址。
如果没有,您将获得NSURLIsSymbolicLinkKey
资源值(作为布尔NSNumber
)来确定是否需要合成这两个图像。要合成它们,请创建一个新图像,通过按顺序绘制两个图像来绘制自己:
NSImage* fileIcon = [[NSWorkspace sharedWorkspace] iconForFile:[item fullPath]];
NSImage* aliasBadge = /* ... load AliasBadgeIcon.icns ... */;
NSImage* badgedFileIcon = [NSImage imageWithSize:fileIcon.size flipped:NO drawingHandler:^BOOL (NSRect dstRect){
[fileIcon drawAtPoint:dstRect.origin fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
[aliasBadge drawAtPoint:dstRect.origin fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
return YES;
}];