在 UIDocumentPickerViewController 中显示自定义 UTI 的图标

Posted

技术标签:

【中文标题】在 UIDocumentPickerViewController 中显示自定义 UTI 的图标【英文标题】:Show Icons for Custom UTIs in UIDocumentPickerViewController 【发布时间】:2014-09-02 14:47:55 【问题描述】:

我正在开发的 ios 应用会导出 UTI。 Info.plist 的相关部分如下所示:

<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.xml</string>
            <string>public.data</string>
        </array>
        <key>UTTypeDescription</key>
        <string>GPX Document</string>
        <key>UTTypeIdentifier</key>
        <string>de.company.app.gpx</string>
        <key>UTTypeSize320IconFile</key>
        <string>Doc320.png</string>
        <key>UTTypeSize64IconFile</key>
        <string>Doc64.png</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <array>
                <string>gpx</string>
            </array>
        </dict>
    </dict>
</array>

我希望应用通过“在...中打开”对话框处理 GPX 文件,因此在同一个 PLIST 中还有一个文档类型定义(引用 UTI):

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeIconFiles</key>
        <array>
            <string>Icon29.png</string>
            <string>Icon58.png</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>de.company.app.gpx</string>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>de.company.app.gpx</string>
        </array>
    </dict>
</array>

在 Safari 中打开 GPX 文件时,它会显示我在 CFBundleTypeIconFiles 下指定的图标,即在视网膜设备上 Icon58.png。该应用程序还允许通过 iOS 8 中引入的 UIDocumentPickerViewController 类进行导入,虽然 UTI 定义可以很好地过滤 iCloud Drive 中的相关文件,但它没有显示我指定的任何艺术品:

我已确保所有引用的图像文件(Icon29.pngIcon58.pngDoc64.pngDoc320.png)确实位于应用程序包的根目录中。它们名称中的数字表示它们的高度(以像素为单位)。 Doc... 文件是正方形,其他两个文件是 this specification(仅限 iPhone)。

我基本上有两个问题:

1) 如何让 UIDocumentPickerViewController 为我们的 UTI 显示自定义图标?

2) 还有其他使用UTTypeSize64IconFileUTTypeSize320IconFile 的用例吗?

【问题讨论】:

【参考方案1】:

很遗憾,答案是除非您的应用能够控制这些文件写入磁盘的方式,否则无法完成。在这种情况下,您可以继承 UIDocument 并写出缩略图。 Here 是 Apple 工程师发布的原始答案,发布在 Apple 开发者论坛上(需要登录)。它包含一个代码示例来说明它是如何完成的。

我还没有找到问题第二部分的答案。

【讨论】:

嗨。所以听起来UIDocumentPickerViewController 为您自己的 UTI 显示自定义图标仅适用于您控制的文件(因为您需要写出缩略图)。如果用户浏览 iCloud 说他们共享的 iCloud ~/desktop 文件夹并找到另一个应用程序编写的 .gpx 文件,那么没有办法指定显示的图标吗?【参考方案2】:

我相信您在 CFBundleTypeIconFiles 键中使用了错误大小的图标。您使用的尺寸是设置图标的大小。

为了验证我的理论,请添加更多不同大小的文件。此外,所有图标都是方形的。您的问题中的图像看起来是矩形的。

根据Icon and Image Design --> App Icon部分:

文档图标

如果您的 iOS 应用程序创建自定义类型的文档,您希望用户 一眼就能认出这些文件。你不需要 为此目的设计一个自定义图标,因为 iOS 使用您的应用程序图标 为您创建文档图标。

摘自App Icons:

应用图标(必需)(iPhone)

60 x 60 像素 120 x 120 像素 (@2x)

这是在 iOS 7 及更高版本的 iPhone 和 iPod touch 上运行的应用程序的主图标。

设置图标(所有设备)

29 x 29 像素 58 x 58 像素 (@2x)

【讨论】:

CFBundleTypeIconFiles 图标的大小在this document(部分:“文档图标”)中非常清楚地记录,也在问题中链接:“22 x 29 像素/44 x 58 像素(高分辨率)”。它们既不是正方形,也没有与设置图标混淆。当然,我们的应用程序中也有普通的应用程序图标,但它们也没有被使用。 帮我一个忙,并在 plist 中的 CFBundleTypeIconFiles 下列出正常的应用程序图标。当我在家中使用我的 MacBook 时,我会进行自己的测试。 这是不正确的请参考官方developer.apple.com/library/ios/documentation/General/Reference/…

以上是关于在 UIDocumentPickerViewController 中显示自定义 UTI 的图标的主要内容,如果未能解决你的问题,请参考以下文章

分配的变量引用在哪里,在堆栈中还是在堆中?

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效