随着项目中的各种自定义弹窗越来越多(底部,右侧,左侧,中心),如果仍然采用 UIView 自定义,虽能实现但是会导致对应的 UIViewController 代码行数剧增,如果业务代码实现在UIView 里,又违背了视图复用原则,遂研究 UIViewController 容器的自定义,经过一段时间的学习,最终完美实现半屏显示:HFNavigationController
在此库基础上,可以将 UIViewController 视图化,实现各种各样的效果,而且代码完美的分布在各自的控制器中。
import SwiftExpand
import HFNavigationController
class ThirdViewController: UIViewController{
let frameCenter = CGRect(x: UIScreen.main.bounds.width*0.05,
y: UIScreen.main.bounds.height*0.25,
width: UIScreen.main.bounds.width*0.9,
height: 300)
lazy var textController: NNAgreementAlertController = {
let controller = NNAgreementAlertController()
// controller.actionTitles = ["one", "two", "three"]
// controller.actionTitles = ["one", ]
controller.actionTitles = ["暂不使用", "同意"]
controller.delegate = self
return controller
}()
lazy var navController: HFNavigationController = {
let controller = HFNavigationController(rootViewController: textController)
controller.modalPresentationStyle = .custom
controller.modalTransitionStyle = .crossDissolve
controller.transitioningDelegate = controller as UIViewControllerTransitioningDelegate
controller.view.layer.cornerRadius = 18
controller.view.layer.masksToBounds = true
controller.setupDefaultFrame(self.frameCenter)
return controller;
}()
// MARK: -lifecycle
override func viewDidLoad() {
super.viewDidLoad()
createBarItem( .done, isLeft: false) { (sender: AnyObject) in
// self.goController("IOPAuthDetailController", obj: nil, objOne: nil)
guard let rootViewController = UIApplication.shared.keyWindow?.rootViewController else { return }
rootViewController.present(self.navController, animated: true, completion: nil)
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
}
extension ThirdViewController: NNAgreementAlertControllerDelegate{
func agreementAlertVC(_ controller: NNAgreementAlertController, sender: UIButton) {
DDLog(sender.currentTitle, sender.tag)
switch sender.tag {
case 0:
exit(0)
default:
controller.dismiss(animated: true, completion: nil)
}
}
func agreementAlertTextView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
DDLog(URL.absoluteString)
if URL.scheme?.contains("_") {
guard let urlString = URL.absoluteString.components(separatedBy: "_").last else { return false}
UIApplication.openURLStr(urlString, prefix: "http://")
}
return true
}
}
网友评论