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