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

时间:2014-01-29 13:02:50

标签: ios objective-c uiview uiview-hierarchy

我有一个包含多个子视图的父UIView

子视图是兄弟姐妹 - 子视图不是彼此的子视图。 (每个人在他们的超级视图中处于相同的层次级别)

例如:

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能够检测到它在视图中移回了heirarchy。怎么办呢?

修改

我了解containerView可以知道哪些子视图高于什么 - 但我不会(不能)containerView通知其子视图他们的订单已更改 - 想象一下,添加一个股票视图的子视图 - 股票视图不知道其子视图,并且他们希望收到这样的通知。

子视图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
}

3 个答案:

答案 0 :(得分:1)

检查indices数组中的view.subviews。指数较低的那个将位于顶部。因此,0 view处的index将位于所有其他位置的顶部。

答案 1 :(得分:1)

您可以浏览containerView.subviews并找到哪个位置。 如果你想在每个addSubview上做这个 - 继承你的containerView并添加你自己的addSubview,它调用父类实现,然后发出子视图数组发生变化的通知(或者只是在那里做检查)。 在通知处理程序中,您可以浏览子视图并按顺序执行任何操作。

答案 2 :(得分:1)

尝试此操作,它将为您提供给定视图背后的所有视图

-(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;}