iOS 查看能见度消失
iOS view visibility gone
我是 iOS 的新手 development.I 想切换 (hide/visible) 来自父视图的子视图 view.In android 有一种方法可以隐藏能见度消失。
在android
subView.setVisibility(View.GONE);
在iOS
subView.removeFromSuperview()
当我使用上面的函数时,它删除了 subViewConstraints 并弄乱了我的滚动视图约束。
topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = true
当我使用上面的代码时,它工作正常并隐藏 subView.but 当我想让子视图可见时,它没有显示子视图。
topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = false
self.view.layoutIfNeeded()
希望你提前理解我的problem.Thanks。
我相信您正在寻找 view.isHidden = true
。这只是在不改变视图层次结构或约束映射的情况下将视图隐藏到位。您随后可以重新显示您的视图。 view.isHidden = false
.
因为我在 iOS 和 Android 上都工作过,所以您需要在 ios 中使用约束插座来实现 Android 功能。 iOS 不支持自动像 Android 原生支持可见性 GONE
& VISIBLE
您需要挂钩特定 constraint
的 outlet
(可能 vertical/horizontal/height)您需要将其设置为 0
并且需要管理您的 UI.
隐藏:
self.viewYourConstraint.constant = 0
self.yourView.hidden = true
self.view.layoutIfNeeded()
显示:
self.viewYourConstraint.constant = 100//your constant value
self.yourView.hidden = false
self.view.layoutIfNeeded()
Note: If other constraints will be affected because of the update to the constraint above, the following must also need to be called:
self.yourView.setNeedsUpdateConstraints()
你说你想隐藏你的子视图并删除它占用的space。如果你想避免搞乱约束,你可以尝试使用堆栈视图:
- 创建
UIStackView
并在堆栈视图及其父视图之间设置适当的约束;
- 将视图添加到堆栈视图;
- 现在您可以通过将
view.isHidden
设置为 true 或 false 来切换这些视图在堆栈视图中的可见性,布局将自动调整。
试试这个扩展:
extension UIView {
func visiblity(gone: Bool, dimension: CGFloat = 0.0, attribute: NSLayoutAttribute = .height) -> Void {
if let constraint = (self.constraints.filter{[=10=].firstAttribute == attribute}.first) {
constraint.constant = gone ? 0.0 : dimension
self.layoutIfNeeded()
self.isHidden = gone
}
}
}
如何使用它....
@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)
}
这是结果:
也许您更喜欢这个解决方案
extension UIView {
enum Visibility {
case visible
case invisible
case gone
}
var visibility: Visibility {
get {
let constraint = (self.constraints.filter{[=10=].firstAttribute == .height && [=10=].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{[=10=].firstAttribute == .height && [=10=].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
}
}
}
}
那么用法是:
someView.visibility = .visible
someView.visibility = .invisible
someView.visibility = .gone
编辑:
提高能力:将在 "Visibility State"
中从故事板开始工作(只需写:'visible'、'invisible'、'gone')
视图内的所有约束都应小于 1000
extension UIView {
enum Visibility: String {
case visible = "visible"
case invisible = "invisible"
case gone = "gone"
}
var visibility: Visibility {
get {
let constraint = (self.constraints.filter{[=12=].firstAttribute == .height && [=12=].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({[=12=].firstAttribute == .height && [=12=].constant == 0 && [=12=].secondItem == nil && ([=12=].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()
}
}
}
我是 iOS 的新手 development.I 想切换 (hide/visible) 来自父视图的子视图 view.In android 有一种方法可以隐藏能见度消失。
在android
subView.setVisibility(View.GONE);
在iOS
subView.removeFromSuperview()
当我使用上面的函数时,它删除了 subViewConstraints 并弄乱了我的滚动视图约束。
topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = true
当我使用上面的代码时,它工作正常并隐藏 subView.but 当我想让子视图可见时,它没有显示子视图。
topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = false
self.view.layoutIfNeeded()
希望你提前理解我的problem.Thanks。
我相信您正在寻找 view.isHidden = true
。这只是在不改变视图层次结构或约束映射的情况下将视图隐藏到位。您随后可以重新显示您的视图。 view.isHidden = false
.
因为我在 iOS 和 Android 上都工作过,所以您需要在 ios 中使用约束插座来实现 Android 功能。 iOS 不支持自动像 Android 原生支持可见性 GONE
& VISIBLE
您需要挂钩特定 constraint
的 outlet
(可能 vertical/horizontal/height)您需要将其设置为 0
并且需要管理您的 UI.
隐藏:
self.viewYourConstraint.constant = 0
self.yourView.hidden = true
self.view.layoutIfNeeded()
显示:
self.viewYourConstraint.constant = 100//your constant value
self.yourView.hidden = false
self.view.layoutIfNeeded()
Note: If other constraints will be affected because of the update to the constraint above, the following must also need to be called:
self.yourView.setNeedsUpdateConstraints()
你说你想隐藏你的子视图并删除它占用的space。如果你想避免搞乱约束,你可以尝试使用堆栈视图:
- 创建
UIStackView
并在堆栈视图及其父视图之间设置适当的约束; - 将视图添加到堆栈视图;
- 现在您可以通过将
view.isHidden
设置为 true 或 false 来切换这些视图在堆栈视图中的可见性,布局将自动调整。
试试这个扩展:
extension UIView {
func visiblity(gone: Bool, dimension: CGFloat = 0.0, attribute: NSLayoutAttribute = .height) -> Void {
if let constraint = (self.constraints.filter{[=10=].firstAttribute == attribute}.first) {
constraint.constant = gone ? 0.0 : dimension
self.layoutIfNeeded()
self.isHidden = gone
}
}
}
如何使用它....
@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)
}
这是结果:
也许您更喜欢这个解决方案
extension UIView {
enum Visibility {
case visible
case invisible
case gone
}
var visibility: Visibility {
get {
let constraint = (self.constraints.filter{[=10=].firstAttribute == .height && [=10=].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{[=10=].firstAttribute == .height && [=10=].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
}
}
}
}
那么用法是:
someView.visibility = .visible
someView.visibility = .invisible
someView.visibility = .gone
编辑:
提高能力:将在 "Visibility State"
中从故事板开始工作(只需写:'visible'、'invisible'、'gone')视图内的所有约束都应小于 1000
extension UIView {
enum Visibility: String {
case visible = "visible"
case invisible = "invisible"
case gone = "gone"
}
var visibility: Visibility {
get {
let constraint = (self.constraints.filter{[=12=].firstAttribute == .height && [=12=].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({[=12=].firstAttribute == .height && [=12=].constant == 0 && [=12=].secondItem == nil && ([=12=].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()
}
}
}