iOS view visibility gone
As I have worked on both iOS & Android, You need to play with constraint outlet in ios to achieve Android functioning. iOS Does not support automatically like Android native support on visibility GONE
& VISIBLE
You need to hook the outlet
of particular constraint
(it may vertical/horizontal/height) you need to set it to 0
& need to manage your UI.
To Hide:
self.viewYourConstraint.constant = 0self.yourView.hidden = trueself.view.layoutIfNeeded()
To Show:
self.viewYourConstraint.constant = 100//your constant valueself.yourView.hidden = falseself.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()
Cheers
Try this extension:
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 } }}
// How you can use this....
@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)}
Here is result:
Maybe you'd prefer this solution
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 } } }}
then the usage is:
someView.visibility = .visiblesomeView.visibility = .invisiblesomeView.visibility = .gone
edit:
improving capabilities: will work from storyboard (just write: 'visible', 'invisible', 'gone') in the "Visibility State"
all constraints inside view should be less then a 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() } }}