UIActivityViewController 在 iOS 17 下不再显示应用程序活动图标

问题描述 投票:0回答:1

我刚刚在 iOS 17(beta 7)下测试我的应用程序。我看到的一个奇怪的问题是

UIActivityViewController
。我的应用程序提供了多个自定义应用程序
UIActivity
实例。在 iPhone 14 Pro 模拟器上的 iOS 17.0 beta 7 下,我的自定义活动的图标都没有出现。这些是在“共享”类别中声明的活动,它们是活动视图顶部的活动行。仅出现圆角矩形阴影,而不是预期的图标。活动名称按预期显示。

奇怪的是,在“操作”类别中声明的自定义活动看起来很好。这只是“分享”活动的问题。 iOS 提供的活动按预期显示其图标。

这张图片显示了我的 3 个自定义活动的位置。没有显示任何图标。 “Freeform”活动由 iOS 提供。

这段代码已经运行了十年。如果我在 iOS 15 或 16 模拟器上运行,它就可以正常工作。仅 iOS 17 存在此问题。

我在文档中没有看到

UIActivityViewController
UIActivity
的任何内容。我查看了 HIG,但没有看到任何相关内容。我在 SO 或 Apple 开发者论坛上没有找到有关此问题的参考。

相关图像在我的项目中的图像资源中设置。对于比例 1、2 和 3,图像为 60pt。

UIActivity
的文档仍然指出,对于 iOS 7 及更高版本,图标应为 60pt(没有提及 iOS 17 的任何更改)。

我自定义的

UIActivity
中相关代码如下:

- (UIImage *)activityImage {
    return [UIImage imageNamed:@"activity1"];
}

我已经验证了这个

activityImage
属性正在被调用,并且它返回的图像始终具有相同的图像。 PNG 是 8 位/彩色 RGBA、非隔行扫描图像。

我的应用程序其余部分中的任何其他图像或图标没有任何问题。仅与

UIActivityViewController

有人在 iOS 17 中遇到过这个问题吗?有什么我不知道的变化吗?

ios uiactivityviewcontroller uiactivity ios17
1个回答
0
投票

我不知道为什么会这样,但如果我更改

activityImage
代码:

- (UIImage *)activityImage {
    return [UIImage imageNamed:@"activity1"];
}

至:

- (UIImage *)activityImage {
    UIImage *res = [UIImage imageNamed:@"activity1"];
    if (@available(iOS 17.0, *)) {
        res = [res imageByPreparingThumbnailOfSize:res.size];
    }
    return res;
}

然后活动图像出现在

UIActivityViewController
上。图像仍然具有相同的大小、相同的渲染模式、相同的格式等。但显然,对
imageByPreparingThumbnailOfSize:
的调用必须进行一些相关更改才能使其正常工作。

如果我在调用

imageByPreparingThumbnailOfSize:
之前和之后查看图像,输出中会有一个非常微小的差异,但我不知道它代表什么。

调用

po res.CGImage
之前
imageByPreparingThumbnailOfSize:
的输出:

<CGImage 0x11755ed20> (IP)
    <<CGColorSpace 0x60000260c300> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1)>
        width = 180, height = 180, bpc = 8, bpp = 32, row bytes = 720 
        kCGImageAlphaNoneSkipLast | 0 (default byte order)  | kCGImagePixelFormatPacked 
        is mask? No, has masking color? No, has soft mask? No, has matte? No, should interpolate? Yes

调用

po res.CGImage
imageByPreparingThumbnailOfSize:
的输出:

<CGImage 0x117778b30> (DP)
    <<CGColorSpace 0x60000260c300> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1)>
        width = 180, height = 180, bpc = 8, bpp = 32, row bytes = 720 
        kCGImageAlphaNoneSkipLast | 0 (default byte order)  | kCGImagePixelFormatPacked 
        is mask? No, has masking color? No, has soft mask? No, has matte? No, should interpolate? Yes

除了内存地址之外,输出中唯一的变化是在第一行。原始图像显示 “(IP)”,而更新后的图像显示 “(DP)”

如果有人知道这些代表什么,请发表评论。


我注意到图标不会像 iOS 16 及更早版本上那样自动赋予圆角。但这是一个需要解决的单独问题。对于其他在 iOS 17 中处理这些未记录的

UIActivityViewController
功能的人来说,只是一个提醒。


对于使用 Swift 的每个人,代码将从:

override var activityImage: UIImage? {
    return UIImage(named: "activity")
}

至:

override var activityImage: UIImage? {
    var res = UIImage(named: "activity1")
    if #available(iOS 17.0, *) {
        if let img = res {
            res = img.preparingThumbnail(of: img.size)
        }
    }
    return res
}
© www.soinside.com 2019 - 2024. All rights reserved.