2011-11-04 33 views
5

iOS,以編程方式,如何能找到什麼最頂部UIView是?如何引用「最頂級」視圖?

換句話說..現在顯示什麼視圖?

說,我有一個筆尖堆疊在一起的3個意見。在程序內部,如果我知道它是什麼,我可以刪除頂部視圖。我怎樣才能找出在筆尖上的視圖?

回答

9

您可以擁有很多最頂層的視圖,因爲視圖不必佔用所有屏幕。

如果你想有一個觀點的最頂部子視圖,您可以撥打

[yourView subviews]; 

,並採取TJE最後一個(他們是在顯示順序,最前最後一)

[[yourView subviews] objectAtIndex:[[yourView subviews] count]]; 

編輯:這是(從評論)

[[yourView subviews] lastObject]; 

更好,如果你知道你的viewController顯示僅僅通過更換yourView rController.view

+0

不要忘了測試是否隱藏。而α!= 0並且該視圖在屏幕上。你的例子中的 –

+0

,我如何知道'yourView'是什麼? – JAM

+0

正如我在我的最後一句中所說的,如果yourMainViewController是處理顯示視圖的控制器(例如,如果您未添加任何modalViewController或未在控制器中推入任何控制器,則爲rootViewController),則yourView可以是yourMainViewController.view。 。 更一般地說,這是您所知道的第一個您目前正在顯示的視圖。 如果你想要一個更精確的答案,你需要解釋你的應用程序是什麼,它顯示什麼,我可能會告訴你你必須使用哪種視圖。 – MatLecu

2

像這樣

UIView *topMost = [[self.view subviews] lastObject]; 
3

或者這樣

UIWindow *window = [[UIApplication sharedApplication].keyWindow; 
UIView *topMost = [window findTopMostViewForPoint:CGPointMake(100, 100)]; 

功能

@implementation UIView (Extra) 

- (UIView *)findTopMostViewForPoint:(CGPoint)point 
{ 
    for(int i = self.subviews.count - 1; i >= 0; i--) 
    { 
     UIView *subview = [self.subviews objectAtIndex:i]; 
     if(!subview.hidden && CGRectContainsPoint(subview.frame, point)) 
     { 
      CGPoint pointConverted = [self convertPoint:point toView:subview]; 
      return [subview findTopMostViewForPoint:pointConverted]; 
     } 
    } 

    return self; 
} 

- (BOOL)isTopmostViewInWindow 
{ 
    if(self.window == nil) 
    { 
     return NO; 
    } 

    CGPoint centerPointInSelf = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); 
    CGPoint centerPointOfSelfInWindow = [self convertPoint:centerPointInSelf toView:self.window]; 
    UIView *view = [self.window findTopMostViewForPoint:centerPointOfSelfInWindow]; 
    BOOL isTopMost = view == self || [view isDescendantOfView:self]; 
    return isTopMost; 
} 

@end 
相關問題