2014-01-29 39 views
1

我有一個帶有幾個子視圖的父母UIView檢測一個UIView是否在父親的另一個UIView後面

子視圖是兄弟姐妹 - 子視圖不是彼此的子視圖。 (每一個在其上海華同heirarchical級)

例如:

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可以知道子視圖是上面什麼什麼 - 但我不wan't(不能)的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 
} 

回答

1

檢查他們indicesview.subviews陣列。低指數的將位居前列。所以view在0 index將在所有其他的頂部。

+0

我想子視圖,以檢測它被送回。我不想明確通知它已被移回。想象一個視圖在可見時發生一些動畫的情況。當它不可見時,我想停止動畫。子視圖需要一些知道它的「z」索引不可見的機制(在另一個視圖下) –

+0

好的。所以只有一個視圖將在頂部(在超視圖)? –

+0

在這個特殊的情況下是的 - 但它可以被推廣 –

1

您可以通過containerView.subviews進行掃描,找出哪個位置在哪個位置。 如果你想在每一個addSubview上做到這一點 - 你的containerView的子類,並添加你自己的addSubview,它調用父類的實現,然後發出通知,子視圖數組改變(或只是做檢查)。 在通知處理程序中,您可以掃描子視圖並按順序執行任何操作。

+0

也許我的問題不夠清楚,我會添加一個修改 –

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