You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS14中UIDocumentPickerController无法占满屏幕问题求助

解决UIDocumentPickerViewController表单样式下的透明区域问题

我来帮你搞定这个文档选择器的视觉问题~这个透明区域其实是因为UIDocumentPickerViewController.formSheet模态样式下,导航栏默认处于半透明状态,导致导航栏下方的区域透出了后面的内容,形成了视觉上的违和感。下面给你两种可行的解决方法:

方法一:全局针对性设置导航栏外观

如果你的App允许对文档选择器的导航栏做单独全局配置,可以在App启动时通过UIAppearance设置,这样所有弹出的文档选择器都会自动应用这个样式:

// 在AppDelegate的application(_:didFinishLaunchingWithOptions:) 或者 SceneDelegate的scene(_:willConnectTo:options:) 中添加
if #available(iOS 14, *) {
    // 仅对UIDocumentPicker内的导航栏生效,不会影响其他页面的导航栏
    let docPickerNavAppearance = UINavigationBar.appearance(whenContainedInInstancesOf: [UIDocumentPickerViewController.self])
    docPickerNavAppearance.barTintColor = .systemBackground
    docPickerNavAppearance.isTranslucent = false
    // 可选:去掉导航栏下方的分割线,让视觉更统一
    docPickerNavAppearance.shadowImage = UIImage()
}

方法二:单独设置当前弹出的文档选择器

如果你只需要修改当前这个文档选择器的样式,可以在present的回调中直接调整它的导航栏属性:

if #available(iOS 14, *) { 
    let supportedTypes: [UTType] = [UTType.text, UTType.data] 
    let documentPicker = UIDocumentPickerViewController(forOpeningContentTypes: supportedTypes, asCopy: true) 
    documentPicker.delegate = self 
    documentPicker.modalPresentationStyle = .formSheet 
    self.present(documentPicker, animated: true) {
        // 修改导航栏背景为系统背景色,关闭半透明特性
        documentPicker.navigationController?.navigationBar.barTintColor = .systemBackground
        documentPicker.navigationController?.navigationBar.isTranslucent = false
        // 可选:移除导航栏分割线,优化视觉连贯性
        documentPicker.navigationController?.navigationBar.shadowImage = UIImage()
    }
}

原理说明

把导航栏的isTranslucent设为false,并将barTintColor设置为和文档内容区域一致的.systemBackground,就能让导航栏下方的区域填充上背景色,消除透明效果,和.fullScreen样式下的视觉表现保持一致。

内容的提问来源于stack exchange,提问作者Kavya Vj Jeergi

火山引擎 最新活动