To run the example project, clone the repo, and run pod install from the Example directory first.
- iOS 10.0+
- Xcode 9.0+
- Swift 4.2+
BaseVCKit is available through CocoaPods. To install it, simply add the following line to your Podfile:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
use_frameworks!
pod "BaseVCKit"If you prefer not to use either of the aforementioned dependency managers, you can integrate SnapKit into your project manually.
import BaseVCKit
public class ViewController: UIViewController, EasyNavigatable {
    private lazy var nextBtn: UIView = {
        let v = UIButton()
        v.setTitle("Next", for: .normal)
        v.addTarget(self, action: #selector(next), for: .touchUpInside)
        self.view.addSubview(v)
        return v
        }()
    public override func viewDidLoad() {
        super.viewDidLoad()
        nextBtn.snp.makeConstraints { (make) in
            make.left.right.bottom.equalToSuperview()
            make.height.equalTo(60)
        }
    }
    public override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        startKeyboardAnimationObserve()
    }
    public override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        stopKeyboardAnimationObserve()
    }
    // MARK: - Action
    func next(sender: UIButton!) {
        let nextVC = UIViewController()
        push(nextVC, isHideBottomBar: true)
    }
}
// NavButtonConfigurable
extension ViewController: NavButtonConfigurable {
    public var backButtonIcon: UIImage? {
        return UIImage(named: "back")
    }
    public var backButtonTitle: String? {
        return ""
    }
    public var closeButtonIcon: UIImage? {
        return UIImage(named: "close")
    }
}import UIKit
import BaseVCKit
class UseKeyboardViewController: BaseViewController {
    private lazy var txtField: UITextField = {
        let v = UITextField()
        v.backgroundColor = UIColor.lightGray
        self.view.addSubview(v)
        return v
    }()
    fileprivate lazy var doneBtn: UIButton = { [unowned self] in
        let v = UIButton()
        v.setTitle("Done", for: .normal)
        v.backgroundColor = .lightGray
        v.addTarget(self, action: #selector(self.done), for: .touchUpInside)
        self.view.addSubview(v)
        return v
        }()
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "Modal"
        layoutSubViews()
    }
    // MARK: - Layout
    private func layoutSubViews() {
        let marginH: CGFloat = 20
        txtField.snp.makeConstraints { (make) in
            make.top.equalTo(100)
            make.left.equalTo(marginH)
            make.right.equalTo(-marginH)
            make.height.equalTo(40)
        }
        doneBtn.snp.makeConstraints { (make) in
            make.left.equalTo(marginH)
            make.right.equalTo(-marginH)
            make.bottom.equalToSuperview().offset(-keyboardFollowOffset)
        }
    }
    // MARK: - Actions
    @objc private func done(sender:UIButton!) {
        view.endEditing(true)
    }
}
// KeyboardObserable
extension ModalViewController: KeyboardSanpable {
    public var keyboardFollowView: UIView? {
        return doneBtn
    }
    public var keyboardFollowOffset: CGFloat {
        return 16
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        startKeyboardAnimationObserveWithViewWillAppear()
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        stopKeyboardAnimationObserveWithViewWillDisAppear()
    }
}import UIKit
import BaseVCKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        window = UIWindow(frame: UIScreen.main.bounds)
        if let w = window {
            w.backgroundColor = UIColor.white
            w.rootViewController = CustomTabbar.tabVC
            w.makeKeyAndVisible()
        }
        return true
    }
}
// MARK: - Spec of TabbarItems
public enum CustomTabbar {
    case home, setting
    
    public static var tabVC: UITabBarController {
        return TabbarVCGenerator.tabVC(menuSpecs: self.allTabMenuSpec)
    }
    static var allTabMenuSpec: [TabbarVCGenerator.TabMenuSpec] {
        return [self.home, self.setting].map{ $0.toMenuSpec }
    }
    var toMenuSpec: TabbarVCGenerator.TabMenuSpec {
        var systemItem: UITabBarSystemItem!
        var vc: UIViewController!
        switch self {
        case .home:
            vc = ViewController()
            systemItem = .search
        case .setting:
            vc = ViewController2()
            systemItem = .history
        }
        return TabbarVCGenerator.TabMenuSpec(viewController: vc, systemItem: systemItem)
    }
}- SnapKit (3.2.0) - A Swift Autolayout DSL for iOS & OS X
seongkyu-sim, seongkyu.sim@gmail.com
BaseVCKit is available under the MIT license. See the LICENSE file for more info.