FusionAds-iOS/FusionAds/Classes/fusion/utils/GuruBannerCoordinator.swift

170 lines
6.4 KiB
Swift
Raw Normal View History

//
// GuruBannerCoordinator.swift
// Pods
//
// Created by 250102 on 2025/5/9.
//
protocol GuruBannerView {
func view() -> UIView
func setPlacementName(placement: String)
func onShow();
func onHide();
}
class GuruBannerCoordinator<T: GuruBannerView> {
private let viewController: UIViewController
public private(set) var bannerAd: T
private var bannerPosition: BannerPosition { return lastShowRequest?.position ?? BannerPosition.bottom }
private var bannerOffset: CGFloat { return CGFloat(lastShowRequest?.offset ?? 0.0) }
private var lastShowRequest: BannerShowRequest? = nil
public private(set) var orientation: ScreenOrientation = .portrait
public init(viewController: UIViewController, bannerAd: T, contentId: Int) {
self.viewController = viewController
self.bannerAd = bannerAd
}
public func logInfo(_ message: String) {
Logger.i(tag: "GuruBannerCoordinator", message: "\(message)")
}
public func logWarn(_ message: String) {
Logger.w(tag: "GuruBannerCoordinator", message: "\(message)")
}
public func show(_ request: BannerShowRequest? = nil) -> Bool {
var shouldReattach = false
// Check if position or offset has changed
if let newOffset = request?.offset, newOffset != Float(bannerOffset) {
shouldReattach = true
}
if let newPosition = request?.position, newPosition != bannerPosition {
shouldReattach = true
}
lastShowRequest = request
guard let container = viewController.viewIfLoaded else {
logWarn("viewController.view is nil, returns false")
return false
}
let bannerAdView = bannerAd.view()
var attached = container.subviews.contains(bannerAdView)
// If we already have a view and parameters changed, remove it
if shouldReattach || !attached {
logInfo("Parameters changed! Re-attaching view!")
if(attached) {
bannerAdView.removeFromSuperview()
}
let isTablet = UIDevice.current.userInterfaceIdiom == .pad
let bannerHeight: CGFloat = isTablet ? 90 : 50
let screenWidth = min(viewController.view.bounds.width, viewController.view.bounds.height)
container.addSubview(bannerAdView)
bannerAdView.translatesAutoresizingMaskIntoConstraints = false
logInfo("BannerAd show!!! bannerSize: \(screenWidth)x\(bannerHeight)")
if let placement = lastShowRequest?.placement {
bannerAd.setPlacementName(placement: placement)
}
// Configure banner position and rotation
var transform = CGAffineTransform.identity
switch bannerPosition {
case .start:
transform = CGAffineTransform(rotationAngle: .pi / 2)
NSLayoutConstraint.activate([
bannerAdView.leadingAnchor.constraint(equalTo: container.safeAreaLayoutGuide.leadingAnchor, constant: bannerOffset),
bannerAdView.centerYAnchor.constraint(equalTo: container.centerYAnchor),
bannerAdView.widthAnchor.constraint(equalToConstant: screenWidth),
bannerAdView.heightAnchor.constraint(equalToConstant: bannerHeight)
])
case .end:
transform = CGAffineTransform(rotationAngle: -(.pi / 2))
NSLayoutConstraint.activate([
bannerAdView.trailingAnchor.constraint(equalTo: container.safeAreaLayoutGuide.trailingAnchor, constant: -bannerOffset),
bannerAdView.centerYAnchor.constraint(equalTo: container.centerYAnchor),
bannerAdView.widthAnchor.constraint(equalToConstant: screenWidth),
bannerAdView.heightAnchor.constraint(equalToConstant: bannerHeight)
])
case .top:
transform = CGAffineTransform(rotationAngle: 0)
NSLayoutConstraint.activate([
bannerAdView.centerXAnchor.constraint(equalTo: container.centerXAnchor),
bannerAdView.topAnchor.constraint(equalTo: container.safeAreaLayoutGuide.topAnchor, constant: bannerOffset),
bannerAdView.heightAnchor.constraint(equalToConstant: bannerHeight),
bannerAdView.widthAnchor.constraint(equalToConstant: screenWidth),
])
default:
transform = CGAffineTransform(rotationAngle: 0)
NSLayoutConstraint.activate([
bannerAdView.centerXAnchor.constraint(equalTo: container.centerXAnchor),
bannerAdView.bottomAnchor.constraint(equalTo: container.safeAreaLayoutGuide.bottomAnchor, constant: -bannerOffset),
bannerAdView.heightAnchor.constraint(equalToConstant: bannerHeight),
bannerAdView.widthAnchor.constraint(equalToConstant: screenWidth)
])
}
bannerAdView.transform = transform
bannerAdView.isHidden = false
bannerAd.onShow()
} else {
bannerAd.view().isHidden = false
bannerAd.onShow()
}
if let placement = request?.placement {
bannerAd.setPlacementName(placement: placement)
}
return true
}
public func hide() -> Bool {
guard let _ = viewController.view.superview?.contains(bannerAd.view()) else {
return true
}
bannerAd.view().isHidden = true
bannerAd.onHide()
return true
}
public func destroy() -> Bool {
bannerAd.view().removeFromSuperview()
return true
}
public func updateOrientation(orientation: ScreenOrientation) -> Bool {
if let _ = viewController.view.superview?.contains(bannerAd.view()), self.orientation != orientation {
let isVisible = !bannerAd.view().isHidden
bannerAd.onHide()
bannerAd.view().isHidden = true
if isVisible {
return show()
}
}
self.orientation = orientation
return true
}
}