如何设置可视性GONE像IOS中的android?

时间:2016-05-20 06:51:11

标签: android ios iphone uilabel show-hide

任何人都知道隐藏标签的简单方法,让屏幕的其他视图使用留空的位置?在显示该视图时,反之亦然。类似Android的setVisibility = GONE for layers。

据我所知,使用setHidden = true只会隐藏屏幕上的视图,但不会重新排列它周围的任何内容。

谢谢

4 个答案:

答案 0 :(得分:12)

在iOS上实现Androids .GON​​E功能的唯一方法是使用UIStackView

通过Apples documentation

  

动态更改堆栈视图的内容堆栈视图   添加,删除或删除视图时自动更新其布局   插入到arrangeSubviews数组中,或者每当其中之一   安排了子视图的隐藏属性更改。

     

SWIFT 3:

// Appears to remove the first arranged view from the stack.
// The view is still inside the stack, it's 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

答案 1 :(得分:2)

您可以使用AutoLayout约束轻松实现此目的。

假设你有三个这样的观点:

lib

并且您希望在某些情况下使视图B消失。

如下设置约束(这些只是示例值):

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

然后在代码中为B的高度创建一个NSLayoutConstraint插座。通过在IB中拖放约束来完成此操作。

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

最后,要使视图消失,只需执行以下操作:

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

请注意,如果您正在为tableview单元格执行此操作,则可能会出现您希望B出现在某些单元格中但不会出现在其他单元格中的情况。

在这种情况下,您必须将高度重置为" normal"您希望它可见的那些单元格的值。

self.bHeight = 0;

答案 2 :(得分:2)

我一直在寻找简单的解决方案并找到它。我不必使用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,然后就可以了。

答案 3 :(得分:1)

如果您的应用支持ios 9及更高版本,则可以使用UIStackView。

但如果您的应用程序支持ios 8,则必须使用Autolayout并为视图添加高度限制

所以如果你想要隐藏而不仅仅是设置高度约束值0。