如何通过点击UIActivityViewController上方区域关闭该控制器?
实现点击UIActivityViewController外部区域关闭弹窗
核心修改逻辑
要实现点击上方红框区域(弹窗外部)关闭UIActivityViewController,关键是正确配置isModalInPresentation属性,同时根据设备类型调整popover相关参数:
- iPad设备:
UIActivityViewController以popover形式展示,需设置isModalInPresentation = false,确保点击popover外部区域可自动关闭弹窗;同时正确指定popoverPresentationController的弹出位置参数。 - 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
相关产品推荐
相关产品推荐

