UIView 隐藏属性为 false,即使超级视图已隐藏

问题描述 投票:0回答:2

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 <<<<<<<<<<<<<<<<<<<<
ios objective-c uiview calayer
2个回答
0
投票

每个子视图都有自己的隐藏属性。如果父视图的隐藏属性设置为 true,并且其某些子视图也标记为隐藏,则当您将父视图的隐藏标志更改为 FALSE 时,父视图及其非隐藏子视图将变为可见,但隐藏子视图将不可见.

我不知道有什么方法可以判断子视图是否真的是非隐藏的,而无需遍历超级视图树,检查所有父视图的隐藏状态。即使这样也不能保证它是可见的,因为它可能会被父级的边界剪切,或者它可能有一个遮罩层,或者它的不透明度可能为零,或者可能还有其他一些东西。


0
投票

这是一个相当于 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
}
© www.soinside.com 2019 - 2024. All rights reserved.