子视图的手势在 SwiftUI 中不起作用

问题描述

使用 Swift5.3.2、iOS14.4.1、Xcode12.4,

我正在尝试在 SwiftUI 中同时使用两个手势。

有问题的子视图是 VideoPlayer。

父视图是一个 ZStack。

我正在使用 .simultaneousGesture 修饰符,希望这将允许所有子视图手势仍然通过。

但他们没有!

以下代码有效,但不允许识别 VideoPlayer 的控制手势。

事实上,我的示例中的 restartScannerTapGesture TapGesture 总是会起作用 - 不幸的是,VideoPlayer 控制手势(如暂停、播放、停止等)被忽略了。

关于在 Swift UI 中向父视图添加手势时如何让子视图手势工作的任何想法??

struct ParentView: View {

    @EnvironmentObject var myURLList

    var body: some View {
        
        let restartScannerTapGesture = TapGesture(count: 1)
            .onEnded {
                actionClickID = UUID()
            }

        ZStack {
            if let url = URL(fileURLWithPath: myURLList[0].path){
                if url.containsImage {
                    Image(uiImage: UIImage(contentsOfFile: url.path)!)
                        .resizable()
                        .scaledToFit()
                        .onAppear() {
                            isVideo = false
                        }
                } else if url.containsVideo {
                    CustomPlayerView(url: url,isVideo: $isVideo)
                        .onAppear() {
                            isVideo = true
                        }
                } else {
                    Text(LocalizedStringKey("MediaNotRecognizedKey"))
                        .multilineTextAlignment(.center)
                        .padding()
                        .onAppear() {
                            isVideo = false
                        }
                }
            } else {
                Text(LocalizedStringKey("MediaNotRecognizedKey"))
                    .multilineTextAlignment(.center)
                    .padding()
                    .onAppear() {
                        isVideo = false
                    }
            }
        }
    }
    .simultaneousGesture(restartScannerTapGesture)
}

这是首先显示视频控件的 CustomPlayerView。 它显然是有问题的子视图。它的手势也应该起作用,但它们不起作用。为什么??

import SwiftUI
import AVKit

class Playerviewmodel: ObservableObject {
    
    @Published var avPlayer: AVPlayer?
    
    func loadFromUrl(url: URL) {
        avPlayer = AVPlayer(url: url)
    }
    
    func playVideo() {
        avPlayer?.play()
    }
    
    func stopVideo() {
        avPlayer?.pause()
        avPlayer?.replaceCurrentItem(with: nil)
    }
}

struct CustomPlayerView: View {
    
    var url : URL
    @Binding var isVideo: Bool
    @StateObject private var playerviewmodel = Playerviewmodel()
    
    var body: some View {
        
           ZStack {
        if let url = URL(fileURLWithPath: list.paths[index]){
            if url.containsImage {
                Image(uiImage: UIImage(contentsOfFile: url.path)!)
                    .resizable()
                    .scaledToFit()
                    .onAppear() {
                        isVideo = false
                    }
            } else if url.containsVideo {
                CustomPlayerView(url: url,isVideo: $isVideo)
                    .onAppear() {
                        isVideo = true
                    }
            } else {
                Text(LocalizedStringKey("MediaNotRecognizedKey"))
                    .multilineTextAlignment(.center)
                    .padding()
                    .onAppear() {
                        isVideo = false
                    }
            }
        } else {
            Text(LocalizedStringKey("MediaNotRecognizedKey"))
                .multilineTextAlignment(.center)
                .padding()
                .onAppear() {
                    isVideo = false
                }
        }
    }
}

以及所需的扩展:

extension URL {
    func mimeType() -> String {
         let pathExtension = self.pathExtension
         if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,pathExtension as Nsstring,nil)?.takeRetainedValue() {
             if let mimetype = UTTypecopyPreferredTagWithClass(uti,kUTTagClassMIMEType)?.takeRetainedValue() {
                return mimetype as String
             }
         }
         return "application/octet-stream"
    }

    var containsImage: Bool {
        let mimeType = self.mimeType()
        guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType,mimeType as CFString,nil)?.takeRetainedValue() else {
             return false
        }
        return UTTypeConformsTo(uti,kUTTypeImage)
    }

    var containsAudio: Bool {
        let mimeType = self.mimeType()
        guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType,nil)?.takeRetainedValue() else {
              return false
        }
        return UTTypeConformsTo(uti,kUTTypeAudio)
    }
    
    var containsVideo: Bool {
        let mimeType = self.mimeType()
        guard  let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType,nil)?.takeRetainedValue() else {
               return false
        }
        return UTTypeConformsTo(uti,kUTTypeMovie)
    }
 }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...