如何解决如何在 SwiftUI 中从子视图呈现 GoogleRewardAd?
我一直在开发图像选择器应用程序,该应用程序将在图像处理过程中显示奖励广告。我在展示奖励广告时遇到了问题。当我从照片中选择图像并点击过程时,奖励广告将出现在 ProcessView 后面。流程如下。
-
主页视图
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) } }
}
-
图像选择器
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) { }
}
-
流程视图
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 举报,一经查实,本站将立刻删除。