带有自定义视图控制器的 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 共享扩展的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌套视图控制器的 iOS 自定义导航

创建类似于新的 iOS 6 按钮共享的自定义共享视图

带有自定义后退按钮的滑动手势冻结根视图控制器

将自定义视图动态添加到 iOS 中的每个视图控制器

ios如何将自定义控制器重定向obj-c代码放在自定义视图中

自定义视图控制器转换偶尔崩溃