144 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Swift
		
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Swift
		
	
	
| //
 | |
| //  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
 | |
|     }
 | |
| }
 |