diff --git a/Sora/SwiftUIVideoView.swift b/Sora/SwiftUIVideoView.swift index 191bc362..aaa6c870 100644 --- a/Sora/SwiftUIVideoView.swift +++ b/Sora/SwiftUIVideoView.swift @@ -105,7 +105,6 @@ public struct SwiftUIVideoView: View where Background: View { /** 画面を背景ビューに切り替えます。 このメソッドは描画停止時のみ有効です。 - TODO(zztkm): State で更新できるか確認する */ public func videoClear(_ flag: Bool) -> SwiftUIVideoView { if flag { @@ -126,6 +125,24 @@ public struct SwiftUIVideoView: View where Background: View { controller.videoView.handlers.onRender = perform return self } + + /// 映像フレームの描画開始時に実行されるブロックを指定します。 + public func videoOnStart(perform: @escaping () -> Void) -> SwiftUIVideoView { + controller.videoView.handlers.onDisconnect = perform + return self + } + + /// 映像フレームの描画停止時に実行されるブロックを指定します。 + public func videoOnStop(perform: @escaping () -> Void) -> SwiftUIVideoView { + controller.videoView.handlers.onAdded = perform + return self + } + + /// 映像が backgroundView に切り替わったときに実行されるブロックを指定します。 + public func videoOnClear(perform: @escaping () -> Void) -> SwiftUIVideoView { + controller.videoView.handlers.onClear = perform + return self + } } /* @@ -159,6 +176,9 @@ private struct RepresentedVideoView: UIViewRepresentable { controller.stream?.videoRenderer = uiView } + /** + 映像の描画を停止します。TODO(zztkm): method 名の検討 (stop start の toggle なので、stop はおかしいかも? + */ private func stop(_ uiView: VideoView) -> VideoView { if isStop { uiView.stop() @@ -168,6 +188,10 @@ private struct RepresentedVideoView: UIViewRepresentable { return uiView } + /** + 画面を背景ビューに切り替えます。 + このメソッドは描画停止時のみ有効です。 + */ private func clear(_ uiView: VideoView) -> VideoView { if isClear { uiView.clear() diff --git a/Sora/VideoView.swift b/Sora/VideoView.swift index 9414c8f7..64869a89 100644 --- a/Sora/VideoView.swift +++ b/Sora/VideoView.swift @@ -15,12 +15,19 @@ public enum VideoViewConnectionMode { case manual } -// Video (SwiftUI 用) で使う +// SwiftUIVideoView (SwiftUI 用) で使う /// :nodoc: public struct VideoViewHandlers { + /// 映像のサイズ変更時に実行される public var onChange: ((CGSize) -> Void)? + /// 映像フレーム描画時に実行される public var onRender: ((VideoFrame?) -> Void)? -} + /// 映像フレームの描画開始時に実行される + public var onStart: (() -> Void)? + /// 映像フレームの描画停止時に実行される + public var onStop: (() -> Void)? + /// 映像が backgroundView に切り替わったときに実行される + public var onClear: (() -> Void)? /** VideoRenderer プロトコルのデフォルト実装となる UIView です。 @@ -173,6 +180,7 @@ public class VideoView: UIView { self.bringSubviewToFront(self.defaultBackgroundView) } } + handlers.onClear?() } } @@ -180,13 +188,12 @@ public class VideoView: UIView { 映像フレームの描画を開始します。 */ public func start() { - print("kensaku: call start") if !isRendering { - print("kensaku: 描画開始") DispatchQueue.main.async { self.bringSubviewToFront(self.contentView) self.isRendering = true } + handlers.onStart?() } } @@ -195,9 +202,8 @@ public class VideoView: UIView { 描画の停止中は ``render(videoFrame:)`` が実行されません。 */ public func stop() { - print("kensaku: call stop") isRendering = false - print("kensaku: isRendering is now \(isRendering)") + handlers.onStop?() } // MARK: - デバッグモード