问题描述
您好,我想将广告添加到swiftUI网格中。网格中包含我从Firebase后端获取的图片,每两张图片之后,我都想要一个广告。
我对SwiftUi和使用广告都是很陌生的,所以我不确定代码的正确性,但这就是我到目前为止所得到的。
// Code for the pictures Grid
struct PicturesGrid: View {
private let data: [Item]
var body: some View {
let gridItems = [GridItem(.fixed(UIScreen.screenWidth / 2),alignment: .leading),GridItem(.fixed(UIScreen.screenWidth / 2),alignment: .leading)]
return ScrollView(showsIndicators: false) {
LazyVGrid(columns: gridItems) {
ForEach(0..<self.data.count,id: \.self) { index in
// Using this workaround for the ad to be on the whole width of the screen
// Also,after every six images I am adding and ad
if index != 0,index % 6 == 0 {
AdView()
.frame(width: UIScreen.screenWidth,height: 280)
.padding(.top,20)
Spacer()
item
.frame(width: UIScreen.screenWidth / 2)
} else {
item
.frame(width: UIScreen.screenWidth / 2)
}
}
}
}
}
// this is for the picture
var item: some View {
NavigationLink(destination: DetailView(viewmodel: Detailviewmodel(item: itemAtIndexPath))) {
Cell(viewmodel: Cellviewmodel(item: itemAtIndexPath))
}
.buttonStyle(PlainButtonStyle())
}
}
// Code for the ad that I am currently using
struct AdView: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIViewController {
let adController = AdViewController(self)
return adController
}
func updateUIViewController(_ uiViewController: UIViewController,context: Context) {}
}
class AdViewController: UIViewController {
private var adView: AdView
/// The height constraint applied to the ad view,where necessary.
var heightConstraint: NSLayoutConstraint?
/// The ad loader. You must keep a strong reference to the GADAdLoader during the ad loading
/// process.
var adLoader: GADAdLoader!
/// The native ad view that is being presented.
var nativeAdView: GADUnifiednativeAdView!
/// The ad unit ID.
let adUnitID = "ca-app-pub-3940256099942544/3986624511"
init(_ adView: AdView) {
self.adView = adView
super.init(nibName: nil,bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
var nibView: Any?
nibView = Bundle.main.loadNibNamed("ListAdView",owner: nil,options: nil)?.first
guard let nativeAdView = nibView as? GADUnifiednativeAdView else {
return
}
setAdView(nativeAdView)
adLoader = GADAdLoader(adUnitID: adUnitID,rootViewController: self,adTypes: [.unifiednative],options: nil)
adLoader.delegate = self
dispatchQueue.global(qos: .background).async {
self.adLoader.load(GADRequest())
}
}
func setAdView(_ adView: GADUnifiednativeAdView) {
// Remove the prevIoUs ad view.
dispatchQueue.main.async { [weak self] in
guard let weakSelf = self else {
return
}
weakSelf.nativeAdView = adView
weakSelf.view.addSubview(weakSelf.nativeAdView)
weakSelf.nativeAdView.translatesAutoresizingMaskIntoConstraints = false
// Layout constraints for positioning the native ad view to stretch the entire width and height
let viewDictionary = ["_nativeAdView": weakSelf.nativeAdView!]
weakSelf.view.addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "H:|[_nativeAdView]|",options: NSLayoutConstraint.FormatOptions(rawValue: 0),metrics: nil,views: viewDictionary)
)
weakSelf.view.addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "V:|[_nativeAdView]|",views: viewDictionary)
)
}
}
}
extension AdViewController: GADUnifiednativeAdLoaderDelegate {
func adLoader(_ adLoader: GADAdLoader,didFailToReceiveAdWithError error:
GADRequestError) {
print("didFailToReceiveAdWithError: \(error)")
}
func adLoader(_ adLoader: GADAdLoader,didReceive nativeAd: GADUnifiednativeAd) {
print("Received unified native ad: \(nativeAd)")
// Deactivate the height constraint that was set when the prevIoUs video ad loaded.
heightConstraint?.isActive = false
// Populate the native ad view with the native ad assets.
// The headline and mediaContent are guaranteed to be present in every native ad.
(nativeAdView.headlineView as? UILabel)?.text = nativeAd.headline
nativeAdView.mediaView?.mediaContent = nativeAd.mediaContent
// This app uses a fixed width for the GADMediaView and changes its height to match the aspect
// ratio of the media it displays.
if let mediaView = nativeAdView.mediaView,nativeAd.mediaContent.aspectRatio > 0 {
heightConstraint = NSLayoutConstraint(
item: mediaView,attribute: .height,relatedBy: .equal,toItem: mediaView,attribute: .width,multiplier: CGFloat(1 / nativeAd.mediaContent.aspectRatio),constant: 0)
heightConstraint?.isActive = true
}
// This asset is not guaranteed to be present. Check that it is before
// showing or hiding it.
(nativeAdView.advertiserView as? UILabel)?.text = nativeAd.advertiser
nativeAdView.advertiserView?.isHidden = nativeAd.advertiser == nil
// In order for the SDK to process touch events properly,user interaction should be disabled.
nativeAdView.callToActionView?.isUserInteractionEnabled = false
// Associate the native ad view with the native ad object. This is
// required to make the ad clickable.
// Note: this should always be done after populating the ad views.
nativeAdView.nativeAd = nativeAd
}
}
我想提一下,目前这是可行的,但我想解决的问题却不知道如何解决:
- 带有图片的网格会加载,但是当我在广告上滚动时,广告要加载并显示需要几秒钟。如何至少在加载时使其隐藏或使其更快?
- 如果我滚动浏览一个广告,则该广告会加载;如果我继续滚动,则当我向上滚动时,该广告将不再加载,必须等待它再次加载。我怎样才能解决这个问题?或针对这种情况的最佳实践是什么?
- 我应该使用多个广告吗?要在显示之前加载它们?如果是,那我应该怎么做?
- 我在这里所做的事情看起来是否还正确?请...我需要一些帮助
解决方法
在SwiftUI网格中展示广告的最佳方法是在您的应用中实施原生广告,以提供个性化的广告体验