UIView 的“hidden”属性为“false”,即使在层次结构中超级视图是隐藏的。
有没有一种实用的方法可以在不爬树的情况下知道 UIView 是否隐藏?
示例:
(lldb) po 0x7ffba8120f40
<UIButtonLabel: 0x7ffba8120f40; frame = (0 6; 25 18); text = ' All'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7ffba8121160>>
(lldb) p (BOOL)[0x7ffba8120f40 isHidden]
(BOOL) $605 = NO
(lldb) po [0x7ffba8120f40 superview]
<UIButton: 0x7ffba811ffd0; frame = (0 15; 100 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7ffba811d200>>
(lldb) p (BOOL)[0x7ffba8120f40 isHidden]
(BOOL) $607 = NO
(lldb) po [0x7ffba8120f40 superview]
<UIButton: 0x7ffba811ffd0; frame = (0 15; 100 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7ffba811d200>>
(lldb) p (BOOL)[0x7ffba811ffd0 isHidden]
(BOOL) $612 = NO
(lldb) po [0x7ffba811ffd0 superview]
<UIView: 0x7ffba811fe60; frame = (16 20; 110 60); autoresize = RM+BM; layer = <CALayer: 0x7ffba811d1e0>>
(lldb) p (BOOL)[0x7ffba811fe60 isHidden]
(BOOL) $614 = NO
(lldb) po [0x7ffba811fe60 superview]
<InsertViewer.ExploreHeader: 0x7ffba4de2f40; baseClass = UICollectionReusableView; frame = (-8 -20; 375 100); clipsToBounds = YES; hidden = YES; opaque = NO; layer = <CALayer: 0x7ffba811ddd0>>
(lldb) p (BOOL)[0x7ffba4de2f40 isHidden]
>>>>>>>>>>>>>>>>>>>(BOOL) $618 = YES <<<<<<<<<<<<<<<<<<<<
每个子视图都有自己的隐藏属性。如果父视图的隐藏属性设置为 true,并且其某些子视图也标记为隐藏,则当您将父视图的隐藏标志更改为 FALSE 时,父视图及其非隐藏子视图将变为可见,但隐藏子视图将不可见.
我不知道有什么方法可以判断子视图是否真的是非隐藏的,而无需遍历超级视图树,检查所有父视图的隐藏状态。即使这样也不能保证它是可见的,因为它可能会被父级的边界剪切,或者它可能有一个遮罩层,或者它的不透明度可能为零,或者可能还有其他一些东西。
这是一个相当于 NSView 的 UIKit
isHiddenOrHasHiddenAncestor
。我已经选择将甚至不在界面中的视图计为在此定义中的“隐藏”视图,但您不必这样做:
var isEffectivelyHidden: Bool {
if !isHidden, let superview = superview {
return superview.isEffectivelyHidden
}
if isHidden { return true }
if self is UIWindow { return false }
return window == nil
}