微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 SwiftUI 中从子视图呈现 GoogleRewardAd?

如何解决如何在 SwiftUI 中从子视图呈现 GoogleRewardAd?

我一直在开发图像选择器应用程序,该应用程序将在图像处理过程中显示奖励广告。我在展示奖励广告时遇到了问题。当我从照片中选择图像并点击过程时,奖励广告将出现在 ProcessView 后面。流程如下。

  1. 主页视图

    struct HomeView:视图{

     @State var showImagePicker = false
     @State var showSheet = false
     @State var forVideo: Bool = false
     @State var forImage: Bool = false
     @State var image = UIImage(systemName: "photo.on.rectangle.angled")!
    
     var body: some View {
    
         vstack {
    
             Image(uiImage: image)
                 .frame(width: 200,height: 200)
    
             Button(action: {
    
                 self.showImagePicker = true
                 self.showSheet = true
    
             },label: {
    
                 Text("Pick Image")
             })
    
             NavigationLink(
                 destination: ProcessView(),label: {
                     Text("Process Image")
                 })
    
         }
         .sheet(isPresented: $showImagePicker){
    
             ImagePicker(isPresented: $showImagePicker,forVideo: $forVideo,needsCamera: $forImage,image: $image)
    
         }
     }
    

    }

  2. 图像选择器

    struct ImagePicker : UIViewControllerRepresentable {

     @Binding var isPresented: Bool
     @Binding var forVideo: Bool
     @Binding var needsCamera: Bool
     @Binding var image: UIImage
    
     func makeUIViewController(context: Context) -> some UIViewController {
         let controller = UIImagePickerController()
         if self.needsCamera {
             controller.sourceType = .camera
             controller.cameraDevice = .front
    
             let tabBarHeight = controller.view.subviews[1].frame.size.height
             let overlay = getoverlay(frame: controller.view.frame,tabBarHeight: tabBarHeight)
             controller.cameraOverlayView = overlay
    
         } else {
             controller.sourceType = .photoLibrary
         }
    
         if self.forVideo {
             controller.mediaTypes = [kUTTypeMovie as String]
    
             controller.allowsEditing = true
             controller.videoQuality = .type640x480
         }
         controller.delegate = context.coordinator
         return controller
     }
    
     func getoverlay(frame: CGRect,tabBarHeight: CGFloat) -> UIView {
         let sampleMask = UIView()
         sampleMask.frame = frame
         sampleMask.frame.origin.y = sampleMask.frame.origin.y + tabBarHeight
         sampleMask.frame.size.height = sampleMask.frame.size.height - sampleMask.frame.size.height/3
         sampleMask.backgroundColor =  UIColor.black.withAlphaComponent(0.3)
    
         let maskLayer = CALayer()
         maskLayer.frame = sampleMask.bounds
         let circleLayer = CAShapeLayer()
         circleLayer.frame = CGRect(x:0,y:0,width: sampleMask.frame.size.width,height: sampleMask.frame.size.height)
         let finalPath = UIBezierPath(roundedRect: CGRect(x:0,height: sampleMask.frame.size.height),cornerRadius: 0)
         let side = sampleMask.frame.size.width - sampleMask.center.x/3
         let circlePath = UIBezierPath(ovalIn: CGRect(x:sampleMask.center.x - side/2,y:sampleMask.frame.height/2 - side/2,width: side,height: side))
         finalPath.append(circlePath.reversing())
         circleLayer.path = finalPath.cgPath
         circleLayer.borderColor = UIColor.white.withAlphaComponent(1).cgColor
         circleLayer.borderWidth = 1
         maskLayer.addSublayer(circleLayer)
    
         sampleMask.layer.mask = maskLayer
    
         return sampleMask
     }
    
     func makeCoordinator() -> ImagePicker.Coordinator {
         return Coordinator(parent: self)
     }
    
     class Coordinator : NSObject,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
         let parent: ImagePicker
         init(parent: ImagePicker) {
             self.parent = parent
         }
         func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediawithInfo info: [UIImagePickerController.InfoKey : Any]) {
    
             if let selectedImageFromPicker = info[.originalImage] as? UIImage {
    
                 self.parent.image = selectedImageFromPicker
                 self.parent.isPresented = false
    
             } else if let videoPath = info[UIImagePickerController.InfoKey.mediaURL] as? URL {
    
             }
         }
    
     }
    
     func updateUIViewController(_ uiViewController: UIViewControllerType,context: Context) {
    
     }
    

    }

  3. 流程视图

    struct ProcessView:视图{

     let rewardedAd = GADRewardedAd(adUnitID: "ca-app-pub-3940256099942544/1712485313")
    
     var body: some View {
    
         vstack {
             Text("Process Image")
         }
         .onAppear(perform: {
    
             rewardedAd.load(GADRequest()) { error in
                 if let error = error {
    
                     print("   Error loading Ad. \(error)")
    
                 } else {
    
                     if(rewardedAd.isReady){
    
                         if let root = UIApplication.shared.windows.last?.rootViewController {
                             self.rewardedAd.present(fromrootViewController: root,delegate: RewardedDelegate(parent: self))
                         }
    
                     }else{
    
                     }
                 }
             }
         })
     }
    

    }

    class RewardedDelegate: NSObject,GADRewardedAdDelegate { 让父级:ProcessView

     init(parent: ProcessView) {
         self.parent = parent
     }
    
     func rewardedAd(_ rewardedAd: GADRewardedAd,userDidEarn reward: GADAdReward) {
    
     }
    
     func rewardedAdDiddismiss(_ rewardedAd: GADRewardedAd) {
    
     }
    

    }

有人遇到同样的问题吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。