// // 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 { 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 } }