🤔So far, when coding for a view, we wrote a combination of configuration code, constraint code, and hierarchical code, resulting in a poor understanding of the source. So, I created a library that helps you separate this configuration code, constraint code, and hierarchical code to make it cleaner.
After inheriting from BaseViewController
, override and implement the setupViews
and setupConstraints
methods.
import UIKit
import UIBaseKit
class SignUpViewController: BaseViewController {
// MARK: - UI
var usernameLabel: UILabel = {
$0.textColor = .black
$0.textAlignment = .right
$0.font = .boldSystemFont(ofSize: 16.0)
$0.text = "Username"
return $0
}(UILabel())
...
var emailLabel: UILabel = {
$0.textColor = .black
$0.textAlignment = .right
$0.font = .boldSystemFont(ofSize: 16.0)
$0.text = "Email"
return $0
}(UILabel())
...
/// After configure propertys for each view,
/// return an array of views to add to the superview in desired order.
override func setupViews() -> [CanBeSubview]? {
// 1) configure views
view.backgroundColor = .white
registerKeyboardObservers()
signUpButton.addTarget(self, action: #selector(signUpButtonDidTouch), for: .touchUpInside)
...
// 2) return subviews
/** 😍 viewController`s view hierarchy
→ keyboardAvoidView
→ containerView
→ usernameLabel
→ usernameTextField
→ emailLabel
→ emailTextField
→ passwordLabel
→ passwordTextField
→ signUpButton
*/
let hierarchy = [
keyboardAvoidView.addSubviews(
containerView.addSubviews(
usernameLabel,
usernameTextField,
emailLabel,
emailTextField,
passwordLabel,
passwordTextField
)
),
signUpButton
]
return hierarchy
}
/// Configure the constraints for each view.
override func setupConstraints() {
// 3) set constraints for each view added to superview.
// 🤓Note: I set constraints for each view using my favorite `FluidAnchor` library.
// https://github.com/audrl1010/FluidAnchor
keyboardAvoidView.flu
.leftAnchor(equalTo: view.leftAnchor)
.topAnchor(equalTo: view.topAnchor)
.rightAnchor(equalTo: view.rightAnchor)
.bottomAnchor(equalTo: view.bottomAnchor)
containerView.flu
.topAnchor(equalTo: view.topAnchor, constant: 60)
.leftAnchor(equalTo: view.leftAnchor, constant: 15)
.rightAnchor(equalTo: view.rightAnchor, constant: -15)
.heightAnchor(equalToConstant: 180)
...
}
}
class BaseView: UIView { ... }
class BaseTableViewCell: UITableViewCell { ... }
class BaseCollectionViewCell: UICollectionViewCell { ... }
class BaseViewController: UIViewController { ... }
pod 'UIBaseKit'
Myung gi son, [email protected]
UIBaseKit is available under the MIT license. See the LICENSE file for more info.