检测一个 UIView 是不是在父级中的另一个 UIView 后面

Posted

技术标签:

【中文标题】检测一个 UIView 是不是在父级中的另一个 UIView 后面【英文标题】:Detect if a UIView is behind another UIView in parent检测一个 UIView 是否在父级中的另一个 UIView 后面 【发布时间】:2014-01-29 13:02:50 【问题描述】:

我有一个父 UIView 有几个子视图。

子视图是兄弟 - 子视图不是彼此的子视图。 (每个人在他们的superview中处于​​相同的层次结构)

例如:

UIView *containerView = [[UIView alloc] initWithFrame:frame];
CustomUIView *childView = [[UIView alloc] initWithFrame:anotherFrame];
CustomUIView *yetAnotherChildView = [[UIView alloc] initWithFrame:anotherFrame];

[containerView addSubview:childView];
[containerView addSubview:yetAnotherChildView];

[containerView bringSubviewToFront:childView];

我希望yetAnotherChildView 能够检测到它已移回视图层次结构中。如何做到这一点?

编辑

我知道containerView 可以知道哪些子视图高于什么 - 但我不想(不能)containerView 通知其子视图他们的顺序已更改 - 想象一下在stock view - stock view 不知道它的子视图,也不知道他们想收到这样的通知。

子视图CustomUIView 需要观察其superview 的一些变化

例如(这可能是一个非常糟糕的解决方案)

CustomUIView

-(id)initWithFrame

  [self.superView addObserver:self forKeyPath:@"subViews" options:options context:context];


- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context

 // if keyPath is "subViews" array check if "this" view is ontop and adjust self accordingly

【问题讨论】:

【参考方案1】:

你可以通过containerView.subviews扫描,找到哪个在哪个位置。 如果您想在每个 addSubview 上执行此操作 - 将您的 containerView 子类化并添加您自己的 addSubview 调用父类实现,然后发出子视图数组更改的通知(或者只是在那里进行检查)。 在通知处理程序中,您可以扫描子视图并按顺序做任何您想做的事情。

【讨论】:

可能我的问题不够清楚,我补充一下【参考方案2】:

view.subviews 数组中检查他们的indices。指数低的将在顶部。所以view at 0 index 将在所有其他人的顶部。

【讨论】:

我想让子视图检测到它被发回了。我不想明确通知它它已被移回。对视图可见时发生动画的情况进行成像。当它不可见时,我想停止动画。子视图需要某种机制来知道其“z”索引不在视线范围内(在另一个视图下方) 好的。所以只有一个视图会在顶部(在超级视图中)? 在这种特殊情况下是的 - 但它可以概括 我认为恰恰相反。具有最低索引(即 0)的视图位于所有其他视图之后。【参考方案3】:

试试这个,它会给你给定视图后面的所有视图

-(NSMutableArray *)getAllViewsBehindView:(UIView *)view
NSMutableArray *tempArr = [NSMutableArray array];

NSArray *subViews = view.superview.subviews;

for (int i = 0; (i < subViews.count); i++)

    UIView *viewT = [subViews objectAtIndex:i];

    if (viewT == view)
    
        return tempArr;
    
    else
    
        if (CGRectIntersectsRect(viewT.frame, view.frame))
        
            [tempArr addObject:viewT];
        
    



return tempArr;

【讨论】:

以上是关于检测一个 UIView 是不是在父级中的另一个 UIView 后面的主要内容,如果未能解决你的问题,请参考以下文章

仅在父级中运行 Maven 插件

在父级中反应handleClick

jQuery:在父级中选择具有类名的内部和外部第一个元素

父级中的Java方法占位符在子级中使用[重复]

PHP在父级中访问子级的私有属性

嵌套 ControlValueAccessor 的角度验证状态未在父级中正确传播,如何实现此验证?