web-dev-qa-db-ja.com

SwiftUIを使用してVStackでAVPlayerを表示する方法

シンプルなAVPlayerを作成しました。 (正しく作成しなかった場合は、修正してください... ????)VStackでSwift uiを使用して表示したいのですが、立ち往生...

少なくともライブラリにAVPlayerビューコンポーネントがあった場合、それは簡単だったでしょうが、ライブラリでそれを見つけられませんでした... ????

これがContentView.Swift内の私のコードです。

//
//  ContentView.Swift
//  test
//
//  Created by Francis Dolbec on 2019-06-26.
//  Copyright © 2019 Francis Dolbec. All rights reserved.
//

import SwiftUI
import AVKit
import AVFoundation

// MARK: variables
var hauteurMenuBar = NSApplication.shared.mainMenu?.menuBarHeight
var urlVideo = URL(string: "/Users/francisdolbec/Movies/Séries Télé/Rick et Morty/Rick.and.Morty.S01E01.VFQ.HDTV.1080p.x264-Kamek.mp4")
let player = AVPlayer(url: urlVideo!)


struct ContentView : View {
    var body: some View {

        VStack {
            Text("Hello World")
                .frame(maxWidth: .infinity, maxHeight: .infinity)
            Text("PATATE!")
            //player.play()
            }

        .frame(minWidth: 1024, idealWidth: 1440, maxWidth: .infinity, minHeight: (640-hauteurMenuBar!), idealHeight: (900-hauteurMenuBar!), maxHeight: .infinity)

    }
}


#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif

ちなみに、Swift uiを使用してビデオプレーヤーを作成する方法を示すチュートリアルがあれば、本当に感謝しています!

[〜#〜] edit [〜#〜]macOSアプリを開発していることを忘れていました。

3
Francis Dolbec

チュートリアルへの迅速な回答や同類に感謝します!

これはNSViewに変換されたコードで、macOSアプリで機能します...

Struct PlayerViewは次のとおりです。

_struct PlayerView: NSViewRepresentable {
    func updateNSView(_ nsView: NSView, context: NSViewRepresentableContext<PlayerView>) {

    }
    func makeNSView(context: Context) -> NSView {
        return PlayerNSView(frame: .zero)
    }
}
_

これがクラスで、ボグダンが言ったような「肉」です。

_class PlayerNSView: NSView{
    private let playerLayer = AVPlayerLayer()

    override init(frame:CGRect){
        super.init(frame: frame)
        let urlVideo = URL(string: "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8")!
        let player = AVPlayer(url: urlVideo)
        player.play()
        playerLayer.player = player
        if layer == nil{
            layer = CALayer()
        }
        layer?.addSublayer(playerLayer)
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func layout() {
        super.layout()
        playerLayer.frame = bounds
    }
}
_

最後に、PlayerView()を使用して、AVPlayerを_struct ContentView_に追加できます。

1
Francis Dolbec