如何在UIActivity中为Action显示资源图、为Share显示SF符号?
解决方案
核心原因
UIKit对不同分类(.action / .share)的自定义UIActivity有不同的图标渲染规则:
- Action类活动:UIKit默认将图标以模板模式渲染,导致自定义资源图的原始色彩、细节丢失,无法正常显示。
- Share类活动:UIKit要求图标为模板模式,直接返回的SF系统符号可能因未明确指定渲染模式或尺寸适配问题,无法被正确识别渲染。
1. 修复Action类型自定义Activity显示资源图的问题
在自定义ActionActivity的activityImage()方法中,强制将资源图设置为原始渲染模式,避免UIKit自动转为模板模式:
class ActionActivity: UIActivity { override var activityCategory: UIActivity.Category { return .action } override func activityImage() -> UIImage? { // 加载资源图并设置为原始渲染模式 guard let image = UIImage(named: "your_custom_action_icon") else { return nil } return image.withRenderingMode(.alwaysOriginal) } // 其他必要方法(如activityTitle、performActivity等)... }
2. 修复Share类型自定义Activity显示SF系统符号的问题
在自定义ShareActivity的activityImage()方法中,明确将SF系统符号设置为模板渲染模式,并可指定尺寸配置确保适配:
class ShareActivity: UIActivity { override var activityCategory: UIActivity.Category { return .share } override func activityImage() -> UIImage? { // 创建SF符号并指定模板渲染模式,同时适配尺寸 let config = UIImage.SymbolConfiguration(scale: .medium) guard let image = UIImage(systemName: "your_system_symbol_name", withConfiguration: config) else { return nil } return image.withRenderingMode(.alwaysTemplate) } // 其他必要方法(如activityTitle、performActivity等)... }
额外注意事项
- 资源图尺寸:自定义资源图需符合UIActivity图标规范,建议提供
60x60pt@3x(iPhone)和76x76pt@2x(iPad)的尺寸,确保在不同设备上显示清晰。 - SF符号选择:尽量选择UIKit推荐的适合分享场景的系统符号,避免使用过于复杂的符号,防止渲染异常。
- 测试验证:修改后需在真机和模拟器上分别测试,确保两种类型的活动图标均正常显示。
内容的提问来源于stack exchange,提问作者Rentel
相关产品推荐
相关产品推荐

