Joh*_*ohn 20 view ios swift swift3 swift4
我是iOS开发的新手.我想从父视图中切换(隐藏/可见)子视图.在android中有一种隐藏可见性的方法.
在android中
subView.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)
在iOS中
subView.removeFromSuperview()
Run Code Online (Sandbox Code Playgroud)
当我使用上面的函数它删除subViewConstraints并弄乱我的滚动视图约束.
topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = true
Run Code Online (Sandbox Code Playgroud)
当我使用上面的代码它工作正常并隐藏subView.but当我想使subView可见时,它不显示subView.
topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = false
self.view.layoutIfNeeded()
Run Code Online (Sandbox Code Playgroud)
希望你能理解我的问题.谢谢你提前.
Muk*_*esh 25
由于我曾在iOS和Android上工作,因此您需要在ios中使用约束插槽来实现Android功能.iOS不一样的知名度Android原生支持自动支持GONE&VISIBLE
您需要将outlet特定的constraint(可能是垂直/水平/高度)挂钩,然后将其设置为0需要管理UI.
隐藏:
self.viewYourConstraint.constant = 0
self.yourView.hidden = true
self.view.layoutIfNeeded()
Run Code Online (Sandbox Code Playgroud)
显示:
self.viewYourConstraint.constant = 100//your constant value
self.yourView.hidden = false
self.view.layoutIfNeeded()
Run Code Online (Sandbox Code Playgroud)
注意:如果由于更新上述约束而影响其他约束,则还必须调用以下内容:
self.yourView.setNeedsUpdateConstraints()
Run Code Online (Sandbox Code Playgroud)
干杯
Kru*_*nal 12
试试这个扩展:
extension UIView {
func visiblity(gone: Bool, dimension: CGFloat = 0.0, attribute: NSLayoutAttribute = .height) -> Void {
if let constraint = (self.constraints.filter{$0.firstAttribute == attribute}.first) {
constraint.constant = gone ? 0.0 : dimension
self.layoutIfNeeded()
self.isHidden = gone
}
}
}
Run Code Online (Sandbox Code Playgroud)
//你怎么用这个....
@IBOutlet weak var testView: UIView?
@IBAction func testVisibilty(switchbutton: UISwitch) -> Void {
let viewHeight:CGFloat = switchbutton.isOn ? 100 : 0.0
self.testView?.visiblity(gone: !switchbutton.isOn, dimension: viewHeight)
// set visibility for width constraint
//let viewWidth:CGFloat = switchbutton.isOn ? 300 : 0.0
//self.testView?.visiblity(gone: !switchbutton.isOn, dimension: viewWidth, attribute: .width)
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
也许您更喜欢这种解决方案
extension UIView {
enum Visibility {
case visible
case invisible
case gone
}
var visibility: Visibility {
get {
let constraint = (self.constraints.filter{$0.firstAttribute == .height && $0.constant == 0}.first)
if let constraint = constraint, constraint.isActive {
return .gone
} else {
return self.isHidden ? .invisible : .visible
}
}
set {
if self.visibility != newValue {
self.setVisibility(newValue)
}
}
}
private func setVisibility(_ visibility: Visibility) {
let constraint = (self.constraints.filter{$0.firstAttribute == .height && $0.constant == 0}.first)
switch visibility {
case .visible:
constraint?.isActive = false
self.isHidden = false
break
case .invisible:
constraint?.isActive = false
self.isHidden = true
break
case .gone:
if let constraint = constraint {
constraint.isActive = true
} else {
let constraint = NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: 0)
self.addConstraint(constraint)
constraint.isActive = true
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
那么用法是:
someView.visibility = .visible
someView.visibility = .invisible
someView.visibility = .gone
Run Code Online (Sandbox Code Playgroud)
编辑:
改进功能:将在“可见性状态”下的情节提要中工作(只需写成:“可见”,“不可见”,“消失”)
视图内的所有约束应小于1000
extension UIView {
enum Visibility: String {
case visible = "visible"
case invisible = "invisible"
case gone = "gone"
}
var visibility: Visibility {
get {
let constraint = (self.constraints.filter{$0.firstAttribute == .height && $0.constant == 0}.first)
if let constraint = constraint, constraint.isActive {
return .gone
} else {
return self.isHidden ? .invisible : .visible
}
}
set {
if self.visibility != newValue {
self.setVisibility(newValue)
}
}
}
@IBInspectable
var visibilityState: String {
get {
return self.visibility.rawValue
}
set {
let _visibility = Visibility(rawValue: newValue)!
self.visibility = _visibility
}
}
private func setVisibility(_ visibility: Visibility) {
let constraints = self.constraints.filter({$0.firstAttribute == .height && $0.constant == 0 && $0.secondItem == nil && ($0.firstItem as? UIView) == self})
let constraint = (constraints.first)
switch visibility {
case .visible:
constraint?.isActive = false
self.isHidden = false
break
case .invisible:
constraint?.isActive = false
self.isHidden = true
break
case .gone:
self.isHidden = true
if let constraint = constraint {
constraint.isActive = true
} else {
let constraint = NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: 0)
// constraint.priority = UILayoutPriority(rawValue: 999)
self.addConstraint(constraint)
constraint.isActive = true
}
self.setNeedsLayout()
self.setNeedsUpdateConstraints()
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
你说你想隐藏你的子视图并删除它占用的空间。如果你想避免搞乱约束,你可以尝试使用堆栈视图:
UIStackView在堆栈视图与其父视图之间创建并设置适当的约束;view.isHidden为 true 或 false来切换堆栈视图内这些视图的可见性,并且布局将自动调整。| 归档时间: |
|
| 查看次数: |
11005 次 |
| 最近记录: |