web-dev-qa-db-ja.com

カスタムViewControllerを備えたiOSShare Extension

YouTubeビデオをアプリで共有できるようにする共有拡張機能を作成していますが、カスタムUIをスムーズに表示するのに苦労しています。生のYoutubeURLだけを含むデフォルトのビューコントローラーの代わりに、サムネイルとビデオタイトルを表示して、Facebookの拡張機能と視覚的に似た何かをしたいと思います。私が最初に試みたのは、MainInterfaceストーリーボードShareViewControllerの編集でしたが、そうすることで、カスタムインターフェイスが簡単に表示され、デフォルトのUIレイアウトによって「オーバーライド」されます。そのため、UIを使用して別のView Controllerをストーリーボードに追加し、ShareViewControllerに追加しました。

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

これの問題は明らかに、カスタムコントローラーがプッシュされる前にデフォルトのビューコントローラーが表示されることです。したがって、問題は、共有拡張機能が開始されたときにカスタムUIをすぐに表示するにはどうすればよいかということです。 .plistでNSExtensionPrincipalClassを試してみましたが、肯定的な結果は得られませんでした

前もって感謝します

9
leandrodemarco

さて、もう少し掘り下げて検索すると、ShareViewControllerを**ではなくUIViewControllerのサブクラスにする必要があることがわかりました。 SLComposeServiceViewController **。ストーリーボードでインターフェイスを設計したので、.plistをそのままにしましたが、VCここで説明するフルスクリーンになるという問題を考慮する必要がありました: iOS 8 Share Extensionカスタムビューコントローラーのサイズ

私はそれを解決するためにそこで@Daleの答えを取りました。

2
leandrodemarco

これらの一般的な手順は、SLComposeServiceViewControllerを使用せずに機能しました( 実装時のコミット時のコードは次のとおりです )。最後の画像は結果を示していますが、ステップ6は、フォームだけでなく、何でもかまいません。

ステップ

  1. codeShareViewControllerを単純なUIViewControllerに変更します

  2. codeShareViewControllerにぼかし効果を追加します

  3. storyboard)コンテナビューをShareViewControllerに追加します

  4. ストーリーボード)ナビゲーションコントローラーを追加

  5. storyboard)ナビゲーションコントローラーを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()

        // https://stackoverflow.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にドラッグし、サイズを調整します。例えば:

enter image description here

ステップ4.ナビゲーションコントローラーを追加する

ナビゲーションコントローラーをオブジェクトライブラリからストーリーボードにドラッグします。

手順5.ナビゲーションコントローラーをShareViewControllerのコンテナービューに埋め込む

Controlキーを押しながらShareViewControllerのコンテナビューからナビゲーションコントローラにドラッグし、メニューから[埋め込み]を選択します。これに似ているはずです:

enter image description here

手順6.ナビゲーションコントローラーでビューコントローラーをカスタマイズします(this SO thread たとえば)を参照)

私の結果:

enter image description here

9
toraritte

Appleによれば、拡張機能の作成時にデフォルトのVCを無効にするだけです。「Xcode共有テンプレートの使用」セクションの注を参照してください。

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

0
Russ J