任何人都知道隐藏标签的简单方法,让屏幕的其他视图使用留空的位置?在显示该视图时,反之亦然。类似Android的setVisibility = GONE for layers。
据我所知,使用setHidden = true只会隐藏屏幕上的视图,但不会重新排列它周围的任何内容。
谢谢
答案 0 :(得分:12)
在iOS上实现Androids .GONE功能的唯一方法是使用UIStackView
动态更改堆栈视图的内容堆栈视图 添加,删除或删除视图时自动更新其布局 插入到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。