// // SPPlayBuyView.swift // MoviaBox // // Created by 佳尔 on 2025/4/28. // import UIKit class SPPlayBuyView: HWPanModalContentView { var buyFinishBlock: (() -> Void)? var shortPlayId: String? { didSet { rechargeView.shortPlayId = shortPlayId memberView.shortPlayId = shortPlayId } } var videoId: String? { didSet { rechargeView.videoId = videoId memberView.videoId = videoId } } //MARK: UI属性 private lazy var bgView: UIImageView = { let view = UIImageView(image: UIImage(named: "buy_bg_image_01")) return view }() private lazy var closeButton: UIButton = { let button = UIButton(type: .custom) button.setImage(UIImage(named: "close_icon_04"), for: .normal) button.addTarget(self, action: #selector(handleCloseButton), for: .touchUpInside) return button }() private lazy var titleLabel: UILabel = { let label = UILabel() label.font = .fontMedium(ofSize: 16) label.textColor = .colorFFFFFF() label.text = "movia_Store".localized return label }() private lazy var restoreButton: UIButton = { let button = UIButton(type: .custom) button.setTitle("movia_Restore".localized, for: .normal) button.setTitleColor(.colorFFFFFF(alpha: 0.5), for: .normal) button.titleLabel?.font = .fontRegular(ofSize: 14) button.addTarget(self, action: #selector(handleRestoreButton), for: .touchUpInside) return button }() private lazy var scrollView: UIScrollView = { let scrollView = UIScrollView() return scrollView }() private lazy var stackView: UIStackView = { let view = UIStackView() view.axis = .vertical view.spacing = 16 return view }() private lazy var rechargeView: SPCoinRechargeView = { let view = SPCoinRechargeView() view.userInfo = SPLoginManager.manager.userInfo view.rechargeFinishHandle = { [weak self] in self?.handleBuyFinish() } return view }() private lazy var memberView: SPMemberRechargeView = { let view = SPMemberRechargeView() view.buyFinishHandle = { [weak self] in self?.handleBuyFinish() } return view }() private lazy var tipTitleLabel: UILabel = { let label = UILabel() label.font = .fontMedium(ofSize: 12) label.textColor = .colorFFFFFF(alpha: 0.7) return label }() private lazy var tipTextLabel: UILabel = { let label = UILabel() label.numberOfLines = 0 label.textColor = .colorFFFFFF(alpha: 0.5) label.font = .fontRegular(ofSize: 12) return label }() override init(frame: CGRect) { super.init(frame: frame) tipTitleLabel.text = "movia_store_tips_title_ios".localized tipTextLabel.text = "movia_store_tips_ios".localized.replacingOccurrences(of: "\\n", with: "\n") _setupUI() requestPayTemplate() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } //MARK: HWPanModalPresentable override func panScrollable() -> UIScrollView? { return scrollView } override func longFormHeight() -> PanModalHeight { return PanModalHeightMake(.content, kSPScreenHeight - kSPNavBarHeight - 10) } override func showDragIndicator() -> Bool { return false } override func backgroundConfig() -> HWBackgroundConfig { let config = HWBackgroundConfig() config.backgroundAlpha = 0.6 return config } override func allowsDragToDismiss() -> Bool { return false } override func allowsTapBackgroundToDismiss() -> Bool { return false } override func allowsPullDownWhenShortState() -> Bool { return false } override func minVerticalVelocityToTriggerDismiss() -> CGFloat { return 0 } override func showsScrollableVerticalScrollIndicator() -> Bool { return false } } extension SPPlayBuyView { ///购买成功 private func handleBuyFinish() { SPLoginManager.manager.updateUserInfo { [weak self] in guard let self = self else { return } self.rechargeView.userInfo = SPLoginManager.manager.userInfo } self.buyFinishBlock?() self.dismiss(animated: true) { } } @objc private func handleRestoreButton() { SPIAPManager.manager.restore { [weak self] isFinish in guard let self = self else { return } self.handleBuyFinish() } } @objc private func handleCloseButton() { self.dismiss(animated: true) { } } } extension SPPlayBuyView { private func _setupUI() { addSubview(bgView) addSubview(closeButton) addSubview(titleLabel) // addSubview(restoreButton) addSubview(scrollView) scrollView.addSubview(stackView) scrollView.addSubview(tipTitleLabel) scrollView.addSubview(tipTextLabel) bgView.snp.makeConstraints { make in make.left.right.top.equalToSuperview() } closeButton.snp.makeConstraints { make in make.top.equalToSuperview().offset(7) make.right.equalToSuperview().offset(-12) make.width.height.equalTo(32) } titleLabel.snp.makeConstraints { make in make.left.equalToSuperview().offset(16) make.centerY.equalTo(closeButton) } // restoreButton.snp.makeConstraints { make in // make.centerY.equalTo(titleLabel) // make.right.equalToSuperview().offset(-16) // } scrollView.snp.makeConstraints { make in make.top.equalToSuperview().offset(58) make.left.right.equalToSuperview() make.bottom.equalToSuperview() } stackView.snp.makeConstraints { make in make.left.right.top.equalToSuperview() // make.bottom.equalTo(-(kSPTabbarSafeBottomMargin + 10)) make.width.equalTo(kSPScreenWidth) } tipTitleLabel.snp.makeConstraints { make in make.left.equalToSuperview().offset(24) make.top.equalTo(stackView.snp.bottom).offset(34) } tipTextLabel.snp.makeConstraints { make in make.left.equalTo(tipTitleLabel) make.right.lessThanOrEqualTo(stackView).offset(-24) make.top.equalTo(tipTitleLabel.snp.bottom).offset(4) make.bottom.equalTo(-(kSPTabbarSafeBottomMargin + 10)) } } } extension SPPlayBuyView { ///请求支付模版 private func requestPayTemplate() { SPWalletAPI.requestPayTemplate { [weak self] templateModel in guard let self = self else { return } self.stackView.removeAllArrangedSubview() if let list = templateModel?.list_sub_vip, list.count > 0 { self.memberView.setDataArr(dataArr: templateModel?.list_sub_vip) self.stackView.addArrangedSubview(self.memberView) } if let list = templateModel?.list_coins, list.count > 0 { self.rechargeView.dataArr = templateModel?.list_coins self.stackView.addArrangedSubview(self.rechargeView) } DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { self.panModalSetNeedsLayoutUpdate() } } } }