Как установить видимость 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
и его.