痛點:
多個視圖從左到右布局(或者上到下),當中間某個視圖因為業務需要隱藏時,
雖然設置了視圖hidden為YES,但是視圖自身的間距還在,其他視圖依賴它的話,會額外多出一塊多余的間距,此時需要花額外的精力去調整這個間距問題,很繁瑣!
解決方案:
利用該Snapkit擴展布局,業務視圖設置hidden即可,間距會自動調整
接口擴展
make.left.equalTo(v.snp.right).offset(10).whenHidden(view, hiddenValue: 0, originalValue: 10)
view.snp_hidden(true)
效果展示
屏幕錄制2023-06-27 12.52.41(1).gif
使用范例
//視圖1
let v = UIView()
v.backgroundColor = .yellow
view.addSubview(v)
v.snp.makeConstraints { make in
make.left.equalTo(10)
make.top.equalTo(200)
make.width.height.equalTo(100)
}
//視圖2
let v1 = UIView()
v1.backgroundColor = .red
view.addSubview(v1)
v1.snp.makeConstraints { make in
make.left.equalTo(v.snp.right).offset(10).whenHidden(v, hiddenValue: 0, originalValue: 10)
make.top.equalTo(200)
make.width.height.equalTo(100).whenHidden(v1, hiddenValue: 0, originalValue: 100)
}
let v2 = UIView()
v2.backgroundColor = .blue
view.addSubview(v2)
v2.snp.makeConstraints { make in
make.left.equalTo(v1.snp.right).offset(10).whenHidden(v1, hiddenValue: 0, originalValue: 10)
make.top.equalTo(200)
make.width.height.equalTo(100)
}
//業務顯隱
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: DispatchWorkItem(block: {
//隱藏
UIView.animate(withDuration: 0.25) {
v1.snp_hidden(true)
self.view.layoutIfNeeded()
}
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: DispatchWorkItem(block: {
//顯示
UIView.animate(withDuration: 0.25) {
v1.snp_hidden(false)
self.view.layoutIfNeeded()
}
}))
}))