You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过点击UIActivityViewController上方区域关闭该控制器?

实现点击UIActivityViewController外部区域关闭弹窗

核心修改逻辑

要实现点击上方红框区域(弹窗外部)关闭UIActivityViewController,关键是正确配置isModalInPresentation属性,同时根据设备类型调整popover相关参数:

  1. iPad设备:
    UIActivityViewController以popover形式展示,需设置isModalInPresentation = false,确保点击popover外部区域可自动关闭弹窗;同时正确指定popoverPresentationController的弹出位置参数。
  2. iPhone设备:
    默认是底部滑入的半屏弹窗,需将isModalInPresentation设为false(原代码设为true是无法关闭的核心原因),无需多余的popover箭头和sourceView配置。

修正后的完整代码

// 初始化分享链接
guard let shareURL = URL(string: url) else { return } // 用Swift原生URL替代NSURL,避免类型冗余
let activityItems = [shareURL]

let activityViewController = UIActivityViewController(
    activityItems: activityItems,
    applicationActivities: nil
)

if UIDevice.current.userInterfaceIdiom == .pad {
    // iPad专属配置
    activityViewController.isModalInPresentation = false
    activityViewController.popoverPresentationController?.sourceView = self.view
    activityViewController.popoverPresentationController?.sourceRect = CGRect(x: 150, y: 150, width: 0, height: 0)
} else {
    // iPhone专属配置:允许点击上方背景关闭
    activityViewController.isModalInPresentation = false
}

// 预配置活动项
activityViewController.activityItemsConfiguration = [
    UIActivity.ActivityType.message
] as? UIActivityItemsConfigurationReading

// 排除不需要的分享渠道
activityViewController.excludedActivityTypes = [
    .postToWeibo,
    .print,
    .assignToContact,
    .saveToCameraRoll,
    .addToReadingList,
    .postToFlickr,
    .postToVimeo,
    .postToTencentWeibo,
    .postToFacebook,
    .postToTwitter
]

self.present(activityViewController, animated: true, completion: nil)

关键说明

  • isModalInPresentation = false:该属性决定模态视图是否允许被外部点击关闭,设为false时,点击弹窗外部会自动触发dismiss操作。
  • iPhone上无需设置popover相关参数,否则会导致布局异常,因为iPhone端的UIActivityViewController默认是底部弹窗样式。
  • 新增guard let做URL初始化校验,避免空链接导致的崩溃问题。

内容的提问来源于stack exchange,提问作者adalovelacy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:41:30