Swift-SnapKit 隐藏中间控件

522 阅读1分钟

image.png

红、蓝、黑是哪个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
    }()
}