带有自定义视图控制器的 iOS 共享扩展
Posted
技术标签:
【中文标题】带有自定义视图控制器的 iOS 共享扩展【英文标题】:iOS Share Extension with custom View Controller 【发布时间】:2018-03-23 15:20:24 【问题描述】:我正在创建一个共享扩展程序以允许将 Youtube 视频共享到我的应用程序中,并且很难顺利地呈现我的自定义 UI。而不是只包含原始 Youtube URL 的默认视图控制器,我想做一些视觉上类似于 Facebook 扩展的事情,显示缩略图和视频标题。 我的第一次尝试是编辑 MainInterface 故事板 ShareViewController,但这样做会简要显示我的自定义界面,并且会被默认 UI 布局“覆盖”。所以我最终将另一个带有我的 UI 的视图控制器添加到情节提要中,并在我添加的 ShareViewController 中
override func presentationAnimationDidFinish()
super.presentationAnimationDidFinish()
DispatchQueue.main.async
self.pushConfigurationViewController(customVC)
这个问题显然是在我的自定义视图控制器被推送之前我仍然可以看到默认视图控制器。 所以问题是如何在共享扩展启动时立即显示我的自定义 UI?我在 .plist 中尝试了 NSExtensionPrincipalClass,但没有任何积极的结果
提前致谢
【问题讨论】:
【参考方案1】:这些一般步骤对我有用,而无需使用 SLComposeServiceViewController
(here's the code at the commit when it was implemented)。最后的图片显示了我们的结果,但第 6 步可以是任何东西,而不仅仅是表格。
步骤:
(code) 将ShareViewController
改为简单的UIViewController
(code) 给ShareViewController
添加模糊效果
(storyboard) 将容器视图添加到ShareViewController
(故事板) 添加导航控制器
(storyboard) 在ShareViewController
的容器视图中嵌入导航控制器
在导航控制器中自定义视图控制器(参见 this SO thread 示例)
步骤 1. 将 ShareViewController
更改为简单的 UIViewController
import UIKit
class ShareViewController: UIViewController
// ^^^^^^^^^^^^^^^^
第二步,给ShareViewController
添加模糊效果
// ShareViewController continued from Step 1.
override func viewDidLoad()
super.viewDidLoad()
// https://***.com/questions/17041669/creating-a-blurring-overlay-view/25706250
// only apply the blur if the user hasn't disabled transparency effects
if UIAccessibilityIsReduceTransparencyEnabled() == false
view.backgroundColor = .clear
let blurEffect = UIBlurEffect(style: .dark)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
//always fill the view
blurEffectView.frame = self.view.bounds
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.insertSubview(blurEffectView, at: 0)
else
view.backgroundColor = .black
// Do any additional setup after loading the view.
步骤 3. 将容器视图添加到 ShareViewController
将对象库中的Container View
拖到情节提要上的ShareViewController
中,并调整尺寸。例如:
步骤 4. 添加导航控制器
将导航控制器从对象库拖到情节提要。
步骤 5. 将导航控制器嵌入ShareViewController
的容器视图中
按住 Control 从ShareViewController
的容器视图中拖动到导航控制器,从菜单中选择“嵌入”。应该看起来像这样:
第 6 步。在导航控制器中自定义视图控制器(参见 this SO thread 示例)
我的结果:
【讨论】:
【参考方案2】:好吧,进一步挖掘和搜索我发现我必须使我的 ShareViewController 成为 UIViewController 的子类,而不是 ** SLComposeServiceViewController**。当我在故事板上设计界面时,我保留了 .plist 原样,但必须考虑到此处描述的 VC 进入全屏的问题:ios 8 Share Extension custom view controller size
我在那里解决了@Dale 的问题。
【讨论】:
【参考方案3】:根据 Apple 的说法,您可以在创建扩展程序时简单地停用默认 VC。请参阅“使用 Xcode 共享模板”部分下的注释。
https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/Share.html
【讨论】:
以上是关于带有自定义视图控制器的 iOS 共享扩展的主要内容,如果未能解决你的问题,请参考以下文章