iOS view visibility gone iOS view visibility gone ios ios

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:

enter image description here


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()        }    }}