How to make Ad Mob banner disappear/clear if It didn't load the ad in SwiftUI?

huangapple go评论78阅读模式
英文:

How to make Ad Mob banner disappear/clear if It didn't load the ad in SwiftUI?

问题

以下是已翻译的代码部分:

  1. public struct SwiftUIBannerAd: View {
  2. @State var height: CGFloat = 0
  3. @State var width: CGFloat = 0
  4. @State var adPosition: AdPosition
  5. let adUnitId: String
  6. public init(adPosition: AdPosition, adUnitId: String) {
  7. self.adPosition = adPosition
  8. self.adUnitId = adUnitId
  9. }
  10. public enum AdPosition {
  11. case top
  12. case bottom
  13. }
  14. public var body: some View {
  15. VStack {
  16. if adPosition == .bottom {
  17. Spacer()
  18. }
  19. //Ad
  20. BannerAd(adUnitId: adUnitId)
  21. .frame(width: width, height: height, alignment: .center)
  22. .onAppear {
  23. setFrame()
  24. }
  25. .onReceive(NotificationCenter.default.publisher(for: UIDevice.orientationDidChangeNotification)) { _ in
  26. setFrame()
  27. }
  28. if adPosition == .top {
  29. Spacer()
  30. }
  31. }
  32. }
  33. func setFrame() {
  34. let safeAreaInsets = UIApplication.shared.windows.first(where: { $0.isKeyWindow })?.safeAreaInsets ?? .zero
  35. let frame = UIScreen.main.bounds.inset(by: safeAreaInsets)
  36. let adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(frame.width)
  37. self.width = adSize.size.width
  38. self.height = adSize.size.height
  39. }
  40. }
  41. class BannerAdVC: UIViewController, GADBannerViewDelegate {
  42. let adUnitId: String
  43. init(adUnitId: String) {
  44. self.adUnitId = adUnitId
  45. super.init(nibName: nil, bundle: nil)
  46. }
  47. required init?(coder: NSCoder) {
  48. fatalError("init(coder:) has not been implemented")
  49. }
  50. var bannerView: GADBannerView = GADBannerView()
  51. override func viewDidLoad() {
  52. bannerView.delegate = self
  53. bannerView.adUnitID = adUnitId
  54. bannerView.rootViewController = self
  55. view.addSubview(bannerView)
  56. }
  57. override func viewDidAppear(_ animated: Bool) {
  58. super.viewDidAppear(animated)
  59. loadBannerAd()
  60. }
  61. override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
  62. super.viewWillTransition(to: size, with coordinator)
  63. coordinator.animate(alongsideTransition: nil) { _ in
  64. self.loadBannerAd()
  65. }
  66. }
  67. func loadBannerAd() {
  68. let frame = view.frame.inset(by: view.safeAreaInsets)
  69. let viewWidth = frame.size.width
  70. bannerView.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth)
  71. if #available(iOS 14, *) {
  72. DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
  73. ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
  74. let request = GADRequest()
  75. DispatchQueue.main.async {
  76. request.scene = self.view.window?.windowScene
  77. self.bannerView.load(request)
  78. }
  79. })
  80. }
  81. } else {
  82. let request = GADRequest()
  83. request.scene = view.window?.windowScene
  84. bannerView.load(request)
  85. }
  86. }
  87. }
  88. struct BannerAd: UIViewControllerRepresentable {
  89. let adUnitId: String
  90. init(adUnitId: String) {
  91. self.adUnitId = adUnitId
  92. }
  93. func makeUIViewController(context: Context) -> BannerAdVC {
  94. return BannerAdVC(adUnitId: adUnitId)
  95. }
  96. func updateUIViewController(_ uiViewController: BannerAdVC, context: Context) {
  97. }
  98. }

我注意到你尝试使广告透明,但没有起作用。你可以尝试将广告视图的背景颜色设置为透明,但隐藏视图并更改其背景色可能会更好。以下是你尝试的代码:

  1. func bannerView(_ bannerView: GADBannerView, didFailToReceiveAdWithError error: Error) {
  2. print("Failed to receive ad: \(error.localizedDescription)")
  3. bannerView.backgroundColor = .clear
  4. bannerView.isHidden = true
  5. }

最后,你将广告添加到视图的代码如下:

  1. if showBannerAd {
  2. HStack {
  3. Spacer()
  4. SwiftUIBannerAd(adPosition: .top, adUnitId: StaticCodes.bannerCode)
  5. .frame(width: GADAdSizeBanner.size.width, height: GADAdSizeBanner.size.height)
  6. .padding()
  7. Spacer()
  8. }
  9. } else {
  10. EmptyView()
  11. .frame(height: 0)
  12. }

希望这有助于解决你的问题。如果你需要更多帮助,请告诉我。

英文:

I have implemented a SwiftUIBannerAd in my iOS app, but sometimes the ads fail to load. In such cases, I want the ad banner to be transparent so that it doesn't occupy any space on the screen. How can I modify the existing code to achieve this?

Here is my current implementation of the banner:

  1. public struct SwiftUIBannerAd: View {
  2. @State var height: CGFloat = 0
  3. @State var width: CGFloat = 0
  4. @State var adPosition: AdPosition
  5. let adUnitId: String
  6. public init(adPosition: AdPosition, adUnitId: String) {
  7. self.adPosition = adPosition
  8. self.adUnitId = adUnitId
  9. }
  10. public enum AdPosition {
  11. case top
  12. case bottom
  13. }
  14. public var body: some View {
  15. VStack {
  16. if adPosition == .bottom {
  17. Spacer()
  18. }
  19. //Ad
  20. BannerAd(adUnitId: adUnitId)
  21. .frame(width: width, height: height, alignment: .center)
  22. .onAppear {
  23. setFrame()
  24. }
  25. .onReceive(NotificationCenter.default.publisher(for: UIDevice.orientationDidChangeNotification)) { _ in
  26. setFrame()
  27. }
  28. if adPosition == .top {
  29. Spacer()
  30. }
  31. }
  32. }
  33. func setFrame() {
  34. let safeAreaInsets = UIApplication.shared.windows.first(where: { $0.isKeyWindow })?.safeAreaInsets ?? .zero
  35. let frame = UIScreen.main.bounds.inset(by: safeAreaInsets)
  36. let adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(frame.width)
  37. self.width = adSize.size.width
  38. self.height = adSize.size.height
  39. }
  40. }
  41. class BannerAdVC: UIViewController, GADBannerViewDelegate {
  42. let adUnitId: String
  43. init(adUnitId: String) {
  44. self.adUnitId = adUnitId
  45. super.init(nibName: nil, bundle: nil)
  46. }
  47. required init?(coder: NSCoder) {
  48. fatalError("init(coder:) has not been implemented")
  49. }
  50. var bannerView: GADBannerView = GADBannerView()
  51. override func viewDidLoad() {
  52. bannerView.delegate = self
  53. bannerView.adUnitID = adUnitId
  54. bannerView.rootViewController = self
  55. view.addSubview(bannerView)
  56. }
  57. override func viewDidAppear(_ animated: Bool) {
  58. super.viewDidAppear(animated)
  59. loadBannerAd()
  60. }
  61. override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
  62. super.viewWillTransition(to: size, with: coordinator)
  63. coordinator.animate(alongsideTransition: nil) { _ in
  64. self.loadBannerAd()
  65. }
  66. }
  67. func loadBannerAd() {
  68. let frame = view.frame.inset(by: view.safeAreaInsets)
  69. let viewWidth = frame.size.width
  70. bannerView.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth)
  71. if #available(iOS 14, *) {
  72. DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
  73. ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
  74. let request = GADRequest()
  75. DispatchQueue.main.async {
  76. request.scene = self.view.window?.windowScene
  77. self.bannerView.load(request)
  78. }
  79. })
  80. }
  81. } else {
  82. let request = GADRequest()
  83. request.scene = view.window?.windowScene
  84. bannerView.load(request)
  85. }
  86. }
  87. }
  88. struct BannerAd: UIViewControllerRepresentable {
  89. let adUnitId: String
  90. init(adUnitId: String) {
  91. self.adUnitId = adUnitId
  92. }
  93. func makeUIViewController(context: Context) -> BannerAdVC {
  94. return BannerAdVC(adUnitId: adUnitId)
  95. }
  96. func updateUIViewController(_ uiViewController: BannerAdVC, context: Context) {
  97. }
  98. }

I was trying to make it work with this, but it didn't do anything:

  1. func bannerView(_ bannerView: GADBannerView, didFailToReceiveAdWithError error: Error) {
  2. print("Failed to receive ad: \(error.localizedDescription)")
  3. bannerView.backgroundColor = .clear
  4. bannerView.isHidden = true
  5. }

I am displaying this Banner in my views like that:

  1. if showBannerAd {
  2. HStack {
  3. Spacer()
  4. SwiftUIBannerAd(adPosition: .top, adUnitId: StaticCodes.bannerCode)
  5. .frame(width: GADAdSizeBanner.size.width, height: GADAdSizeBanner.size.height)
  6. .padding()
  7. Spacer()
  8. }
  9. } else {
  10. EmptyView()
  11. .frame(height: 0)
  12. }

答案1

得分: 0

在ZStack中执行以下操作并嵌入:

  1. VStack {
  2. Spacer()
  3. if showBannerAd {
  4. HStack {
  5. Spacer()
  6. SwiftUIBannerAd(adPosition: .top, adUnitId: StaticCodes.bannerCode)
  7. .frame(width: GADAdSizeBanner.size.width, height: GADAdSizeBanner.size.height)
  8. Spacer()
  9. }
  10. } else {
  11. EmptyView()
  12. .frame(height: 0)
  13. }
  14. }
英文:

Do this and embed in the ZStack

  1. VStack {
  2. Spacer()
  3. if showBannerAd {
  4. HStack {
  5. Spacer()
  6. SwiftUIBannerAd(adPosition: .top, adUnitId: StaticCodes.bannerCode)
  7. .frame(width: GADAdSizeBanner.size.width, height: GADAdSizeBanner.size.height)
  8. Spacer()
  9. }
  10. } else {
  11. EmptyView()
  12. .frame(height: 0)
  13. }
  14. }

huangapple
  • 本文由 发表于 2023年3月31日 15:54:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/75896110.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定