iOS 与自定义视图控制器共享扩展

iOS Share Extension with custom View Controller

我正在创建一个共享扩展程序以允许将 Youtube 视频共享到我的应用程序中,但我很难顺利地展示我的自定义 UI。而不是只包含原始 Youtube URL 的默认视图控制器,我想做一些视觉上类似于 Facebook 扩展的东西,显示缩略图和视频标题。 我的第一次尝试是编辑 MainInterface 故事板 ShareViewController,但这样做会简要显示我的自定义界面,并且默认 UI 布局会得到 "overriden"。所以我最终将另一个带有 UI 的视图控制器添加到情节提要中,并在我添加的 ShareViewController 中添加了

override func presentationAnimationDidFinish() {
    super.presentationAnimationDidFinish()
    DispatchQueue.main.async {
        self.pushConfigurationViewController(customVC)
    }

这个问题显然是在推送我的自定义视图控制器之前,我仍然可以看到默认的视图控制器。 所以问题是如何在共享扩展启动时立即显示我的自定义 UI?我在 .plist 中尝试了 NSExtensionPrincipalClass 但没有任何积极的结果

提前致谢

好吧,进一步挖掘和搜索我发现我必须让我的 ShareViewController 成为 UIViewController 的子类而不是 * * SLComposeServiceViewController**。当我在 Storyboard 上设计界面时,我保留了 .plist 原样,但必须考虑 VC 此处描述的全屏显示问题:iOS 8 Share Extension custom view controller size

我在那里接受了@Dale 的回答来解决它。

这些一般步骤对我有用,但没有使用 SLComposeServiceViewController (here's the code at the commit when it was implemented)。最后的图片显示了我们的结果,但是第 6 步 可以是任何东西,而不仅仅是一个表格。

步骤:

  1. (code) 将ShareViewController改为简单的UIViewController

  2. (code) 添加模糊效果到ShareViewController

  3. (故事板) 添加容器视图到ShareViewController

  4. (故事板) 添加导航控制器

  5. (故事板) 在ShareViewController的容器视图中嵌入导航控制器

  6. 自定义导航控制器中的视图控制器(参见 this SO thread 例如


第 1 步。将 ShareViewController 更改为简单的 UIViewController

import UIKit

class ShareViewController: UIViewController {
//                         ^^^^^^^^^^^^^^^^

步骤 2. 添加模糊效果 ShareViewController

    // ShareViewController continued from Step 1.

    override func viewDidLoad() {
        super.viewDidLoad()

        // 

        // 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

从Object Library拖一个Container View到storyboard上的ShareViewController,并调整尺寸。例如:

步骤 4. 添加导航控制器

将导航控制器从对象库拖到故事板。

第 5 步。在 ShareViewController 的容器视图中嵌入导航控制器

按住 Control 从 ShareViewController 的容器视图拖动到导航控制器,select 从菜单中选择“Embed”。看起来应该类似于:

第 6 步。自定义导航控制器中的视图控制器(参见 this SO thread 例如

我的结果:

根据 Apple 的说法,您可以在创建扩展时简单地停用默认设置 VC。请参阅 "Use the Xcode Share Template" 部分下的注释。

https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/Share.html