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