2014-01-29 2 views
1

부모가 여러 하위 뷰가있는 UIView입니다.부모의 다른 UIView 뒤에 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 그것이 다시보기 계층 구조에서 이동 된 감지 할 수 있어야합니다. 어떻게 할 수 있습니까?

편집 :

은 내가 containerView가 파단 무엇보다 무엇인지 알 수 이해 -하지만 난 containerView이 순서가 변경된 것을 그 파단 통지 (수) wan't하지 않습니다 - 추가 상상 주식 시세의 하위 뷰 ontop - 주식 시세는 하위 뷰에 대해 알지 못하며 그러한 통지를 받기를 원합니다.

하위 뷰 CustomUIView (이 아마 아주 나쁜 솔루션입니다)

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 배열을 확인, 예를 들어 그 superview

에 약간의 변화를 관찰 할 필요가있다. 색인이 낮은 사람이 맨 위에 올 것입니다. 0 index에있는 view은 다른 모든 것의 맨 위에 있습니다.

+0

내가 다시 전송 된 검출하기 위해 하위 뷰를 원한다. 나는 그것이 그것이 뒤로 옮겨 졌다는 것을 명시 적으로 알려주고 싶지 않습니다. 시각적으로 볼 때 일부 애니메이션이 발생하는 경우를 이미징합니다. '보이지 않을 때 나는 애니메이션을 멈추고 싶다. 하위보기에는 "z"색인이 다른보기 아래에있는 것을 알 수있는 메커니즘이 필요합니다. –

+0

Ok. 그래서 하나의보기 만 (슈퍼 뷰에서) 표시됩니까? –

+0

이 특별한 경우 예 -하지만 일반화 될 수 있습니다 –

1

containerView.subviews를 스캔하여 어느 위치에 있는지 확인할 수 있습니다. 모든 addSubview - container 클래스를 하위 클래스로 만들고 부모 클래스 구현을 호출하는 자체 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;}