Как установить видимость GONE как android в IOS?

Кто-нибудь знает простой способ скрыть ярлык и позволить другим представлениям экрана использовать пустое место? И сделайте наоборот, показывая это мнение. Что-то вроде Android setVisibility = GONE для слоев.

Насколько я знаю, использование setHidden = true только скрывает представление от экрана, но не изменяет ничего вокруг.

Спасибо

Ответ 1

Единственный способ достичь андроидов. Функциональность GOON на iOS - использовать UIStackView

через Документация яблок

Динамическое изменение содержимого представлений стека Просмотр стека автоматически обновляет свой макет, когда виды добавляются, удаляются или вставлен в массив builtSubviews или когда один из упорядоченные изменения скрытых свойств subviewss.

SWIFT 3:

// Appears to remove the first arranged view from the stack.
// The view is still inside the stack, it just no longer visible, and no longer contributes to the layout.
let firstView = stackView.arrangedSubviews[0]
firstView.hidden = true

SWIFT 4:

let firstView = stackView.arrangedSubviews[0]
firstView.isHidden = true

Ответ 2

Вы можете легко достичь этого, используя ограничения AutoLayout.

Предположим, что у вас есть три вида:

+-----+
|  A  |
+-----+
+-----+
|  B  |
+-----+
+-----+
|  C  |
+-----+

и вы хотите сделать вид B исчезнут в некоторых случаях.

Установите ограничения следующим образом (это только примерные значения):

B top space to A:  4
C top space to B:  4
B height: 20

Затем создайте в своем коде строку высоты NSLayoutConstraint для высоты B. Сделайте это, перетащив ограничение в IB.

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bHeight;

Наконец, чтобы исчезнуть вид, просто выполните следующие действия:

self.bHeight = 0;

Обратите внимание, что если вы делаете это для ячейки tableview, у вас могут быть случаи, когда вы хотите, чтобы B появлялся в некоторых ячейках, но не в других.

В этом случае вам нужно будет reset height до своего "нормального" значения для тех ячеек, где вы хотите, чтобы он был видимым.

self.bHeight = 24;

Ответ 3

Вы можете использовать UIStackView, если ваше приложение поддерживает ios 9 и выше.

но если ваше приложение поддерживает ios 8, а также вы должны выполнить его с помощью Autolayout и добавить ограничение высоты для просмотра

Итак, если вы хотите скрыть, а не просто установить ограничение по высоте 0.

Ответ 4

Я искал простое решение и нашел его. Мне не нужно использовать UIStackView или создать выход для ограничения. Просто используйте это:

class GoneConstraint {
    private var constraint: NSLayoutConstraint
    private let prevConstant: CGFloat

    init(constraint: NSLayoutConstraint) {
        self.constraint = constraint
        self.prevConstant = constraint.constant
    }

    func revert() {
        self.constraint.constant = self.prevConstant
    }
}


fileprivate struct AssociatedKeys {
    static var widthGoneConstraint: UInt8 = 0
    static var heightGoneConstraint: UInt8 = 0
}


@IBDesignable
extension UIView {

    @IBInspectable
    var gone: Bool {
        get {
            return !self.isHidden
        }
        set {
            update(gone: newValue)
        }
    }

    weak var widthConstraint: GoneConstraint? {
        get {
            return objc_getAssociatedObject(self, &AssociatedKeys.heightGoneConstraint) as? GoneConstraint
        }
        set(newValue) {
            objc_setAssociatedObject(self, &AssociatedKeys.widthGoneConstraint, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    weak var heightConstraint: GoneConstraint? {
        get {
            return objc_getAssociatedObject(self, &AssociatedKeys.heightGoneConstraint) as? GoneConstraint
        }
        set(newValue) {
            objc_setAssociatedObject(self, &AssociatedKeys.heightGoneConstraint, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }

    private func update(gone: Bool) {
        isHidden = gone
        if gone {
            for constr in self.constraints {
                if constr.firstAttribute == NSLayoutAttribute.width {
                    self.widthConstraint = GoneConstraint(constraint: constr)
                }
                if constr.firstAttribute == NSLayoutAttribute.height {
                    self.heightConstraint = GoneConstraint(constraint: constr)
                }
                constr.constant = 0
            }
        } else {
            widthConstraint?.revert()
            heightConstraint?.revert()
        }
    }
}

Теперь вы можете вызвать view.gone = true и его.