在viewDidAppear中可以正确获取view的frame,但是在这里面才开始布局的话,看起来会有延迟,很迟钝,而在viewWillAppear又无法获取正确的view的frame,那么如何在viewDidAppear之前布局呢。
我的解决方法:在viewWillLayoutSubViews最后一次调用的时候,可以获取到view正确的frame,那么只要调用该函数的时候进行布局。
import UIKit
enum MoreViewControllerType {
case online
case nearBy
}
class MoreViewController: BaseViewController {
var vcManager: MyVCManagerView?
var type = MoreViewControllerType.online
let onlineVC: MatchOnlineViewController = {
return MatchOnlineViewController.init(nibName: "MatchOnlineViewController", bundle: nil)
}()
let nearVC = MatchNearByViewController.init(nibName: "MatchOnlineViewController", bundle: nil)
let vcTitles = [NSLocalizedString("线上赛", comment: ""), NSLocalizedString("附近赛事", comment:"")]
private var isFirstLoad = true
override func viewDidLoad() {
super.viewDidLoad()
initNavBar()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
//因为该函数不止调用一次,所以每次调用都要先移除之前已经添加的,然后重新添加
if vcManager != nil {
vcManager?.removeFromSuperview()
vcManager = nil
}
initUI()
}
private func initNavBar() {
navigationItem.title = NSLocalizedString("赛程", comment: "")
let leftItem = UIBarButtonItem.init(image: UIImage.init(named: "left_arrow"), style: .done, target: self, action: #selector(exitVC))
leftItem.tintColor = UIColor.white
navigationItem.setLeftBarButton(leftItem, animated: false)
}
@objc private func exitVC() {
navigationController?.popViewController(animated: true)
}
private func initUI() {
if vcManager == nil {
vcManager = MyVCManagerView.init(frame: view.bounds)
vcManager?.addVC([onlineVC, nearVC], withTitle: vcTitles, buttonViewWidth: 200)
view.addSubview(vcManager!)
switch type {
case .nearBy:
vcManager?.moveTo(1)
default:
break
}
}
}
}