// // GuruBannerCoordinator.swift // Pods // // Created by 250102 on 2025/5/9. // protocol GuruMRecView { func view() -> UIView func onShow(); func onHide(); } class GuruMRecCoordinator { private let viewController: UIViewController private var mrecAd: GuruMRecView private var contentView: UIView? private var currentUid2Token: String = "" private var horizontalOffset: CGFloat = 0.0 private var verticalOffset: CGFloat = 0.0 private var orientation: ScreenOrientation = .portrait private let contentId: Int public init(viewController: UIViewController, mrecAd: GuruMRecView, contentId: Int) { self.viewController = viewController self.mrecAd = mrecAd self.contentId = contentId } public func logInfo(_ message: String) { Logger.i(tag: "GuruBannerCoordinator", message: "\(message)") } public func show(request: MRecShowRequest? = nil) -> Bool { let placement = request?.placement let newHorizontalOffset = request?.horizontalOffset let newVerticalOffset = request?.verticalOffset var shouldReattach = false // Check if position or offset has changed if let offset = newVerticalOffset, offset != Float(verticalOffset) { verticalOffset = CGFloat(offset) shouldReattach = true } if let offset = newHorizontalOffset, offset != Float(horizontalOffset) { horizontalOffset = CGFloat(offset) shouldReattach = true } // If we already have a view and parameters changed, remove it if let contentView = contentView, shouldReattach { logInfo("Parameters changed! Re-attaching view!") contentView.removeFromSuperview() self.contentView = nil } let mrecAdView = mrecAd.view() // Create new content view if needed if contentView == nil { let container = UIView() container.tag = contentId viewController.view.addSubview(container) container.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ container.leadingAnchor.constraint(equalTo: viewController.view.leadingAnchor), container.trailingAnchor.constraint(equalTo: viewController.view.trailingAnchor), container.topAnchor.constraint(equalTo: viewController.view.topAnchor), container.bottomAnchor.constraint(equalTo: viewController.view.bottomAnchor) ]) contentView = container // Standard MREC size is 300x250 let mrecWidth: CGFloat = 300 let mrecHeight: CGFloat = 250 mrecAdView.translatesAutoresizingMaskIntoConstraints = false container.addSubview(mrecAdView) NSLayoutConstraint.activate([ mrecAdView.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: horizontalOffset), mrecAdView.topAnchor.constraint(equalTo: container.topAnchor, constant: verticalOffset), mrecAdView.widthAnchor.constraint(equalToConstant: mrecWidth), mrecAdView.heightAnchor.constraint(equalToConstant: mrecHeight) ]) mrecAdView.isHidden = false mrecAd.onShow() } else { mrecAd.onShow() mrecAd.view().isHidden = false } return true } public func hide() -> Bool { guard let _ = viewController.view.viewWithTag(contentId) else { return true } if !mrecAd.view().isHidden { mrecAd.onHide() mrecAd.view().isHidden = true } return true } public func destroy() -> Bool{ mrecAd.view().removeFromSuperview() contentView?.removeFromSuperview() contentView = nil return true } public func updateOrientation(orientation: ScreenOrientation) -> Bool { if let _ = viewController.view.viewWithTag(contentId), self.orientation != orientation { let isVisible = !mrecAd.view().isHidden mrecAd.onHide() mrecAd.view().isHidden = true contentView?.removeFromSuperview() contentView = nil if isVisible { return show() } } self.orientation = orientation return true } }