IOS просматривает видимость

Я новичок в разработке iOS. Я хочу переключать (скрывать/видеть) подвью из родительского представления. В Android-браузере есть способ скрыть видимость, чтобы уйти.

В андроиде

subView.setVisibility(View.GONE);

В iOS

subView.removeFromSuperview()

когда я использую функцию выше, он удаляет subViewConstraints и испортил мои ограничения прокрутки.

topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = true

когда я использую вышеуказанный код, он отлично работает и скрывает subView.but, когда я хочу сделать subView видимым, он не показывает subView.

topsubView.bottomAnchor.constraint(equalTo: bottomSubView.topAnchor, constant: 8).isActive = false
self.view.layoutIfNeeded()

Надеюсь, ты поймешь мою проблему. Спасибо в Advance.

Ответ 1

Поскольку я работал как с iOS, так и с Android, вам нужно играть с ограниченным доступом в ios для обеспечения работы Android. iOS Не поддерживается автоматически, как поддержка Android на основе видимости GONE и VISIBLE

Вам нужно зацепить outlet конкретного constraint (он может вертикально/горизонтально/высота), вам нужно установить его на 0 и вам нужно будет управлять своим пользовательским интерфейсом.

Скрыть:

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

Примечание. Если другие ограничения будут затронуты из-за обновления вышеприведенного ограничения, необходимо также вызвать следующее:

self.yourView.setNeedsUpdateConstraints()

Приветствие

Ответ 2

Попробуйте это расширение:

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

//Как вы можете использовать это....

@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)

}

Вот результат:

enter image description here

Ответ 3

Вы говорите, что хотите скрыть свое подвью и удалить занимаемое им пространство. Если вы хотите избежать беспорядка с ограничениями, вы можете попробовать использовать представления стека:

  • Создайте UIStackView и установите соответствующие ограничения между представлением стека и его родительским представлением;
  • Добавить виды в представление стека;
  • Теперь вы можете переключать видимость этих представлений в представлении стека, установив view.isHidden в true или false, и макет будет автоматически настраиваться.

Ответ 4

Может быть, вы бы предпочли это решение

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

тогда использование:

someView.visibility = .visible
someView.visibility = .invisible
someView.visibility = .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{$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()
        }
    }
}

Ответ 5

Я считаю, что вы ищете view.isHidden = true. Это просто скрывает представление на месте без изменения иерархии представлений или сопоставления ограничений. Затем вы можете повторно показать свое мнение. с view.isHidden = false.

Ответ 6

  • Используйте это, когда вы хотите скрыть свой вид: view.isHidden = true
  • & когда u хочет показать представление: view.isHidden = false

Ответ 7

Ограничение высоты крюка представления как IBOutlet

Чтобы скрыть

 self.viewHeightCon.constant = 0

 self.view.layoutIfNeeded()

Чтобы показать

 self.viewHeightCon.constant = 300

 self.view.layoutIfNeeded()

этим видом скрывается без пробела