红、蓝、黑是哪个view使用Snapkit布局, 如果直接隐藏蓝色View 红和黑之前会有一个很大的空隙,黑色并不能完全变到蓝色位置。所以需要使用Constraint进行处理。在隐藏的时候只要把蓝色View的top、height设置为0、即可解决这个问题。
import UIKit
import RxSwift
import RxCocoa
import SnapKit
class ALSnapKitViewController: ALViewController {
var themeViewTopConstraint: Constraint?
var themeViewHeightConstraint: Constraint?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func initUI() {
super.initUI()
contentView.addSubviews([redView, themeView, blackView])
redView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(autoSize(number: 100))
make.width.equalTo(autoSize(number: 100))
make.height.greaterThanOrEqualTo(autoSize(number: 40))
make.centerX.equalToSuperview()
}
themeView.snp.makeConstraints { make in
self.themeViewTopConstraint = make.top.equalTo(redView.snp.bottom).offset(autoSize(number: 100)).constraint
make.width.equalTo(autoSize(number: 100))
self.themeViewHeightConstraint = make.height.greaterThanOrEqualTo(autoSize(number: 40)).constraint
make.centerX.equalToSuperview()
}
blackView.snp.makeConstraints { make in
make.top.equalTo(themeView.snp.bottom).offset(autoSize(number: 100))
make.width.equalTo(autoSize(number: 100))
make.height.greaterThanOrEqualTo(autoSize(number: 40))
make.centerX.equalToSuperview()
}
themeView.rx.tap().subscribe(onNext: { _ in
self.themeViewTopConstraint?.update(offset: 0)
self.themeViewHeightConstraint?.update(offset: 0)
}).disposed(by: rx.disposeBag)
blackView.rx.tap().subscribe(onNext: { _ in
self.themeViewTopConstraint?.update(offset: autoSize(number: 100))
self.themeViewHeightConstraint?.update(offset: autoSize(number: 40))
}).disposed(by: rx.disposeBag)
}
override func bindViewModel() {
super.bindViewModel()
guard let viewModel = viewModel as? ALSnapKitViewModel else {
return
}
let input = ALSnapKitViewModel.Input()
let output = viewModel.transform(input: input)
}
lazy var redView: UIView = {
let temp = UIView()
temp.theme_backgroundColor = AutoColor.red
return temp
}()
lazy var themeView: UIView = {
let temp = UIView()
temp.theme_backgroundColor = AutoColor.theme
return temp
}()
lazy var blackView: UIView = {
let temp = UIView()
temp.theme_backgroundColor = AutoColor.black
return temp
}()
}