【发布时间】:2011-12-22 09:10:18
【问题描述】:
在iOS 中,如何以编程方式找到top most UIView 是什么?
换句话说..现在显示什么视图?
说,我有一个 3 个视图堆叠在一起的笔尖。在程序内部,如果我知道它是什么,我可以删除顶视图。我怎样才能知道笔尖上的视图是什么?
【问题讨论】:
在iOS 中,如何以编程方式找到top most UIView 是什么?
换句话说..现在显示什么视图?
说,我有一个 3 个视图堆叠在一起的笔尖。在程序内部,如果我知道它是什么,我可以删除顶视图。我怎样才能知道笔尖上的视图是什么?
【问题讨论】:
您可以拥有很多最热门的视图,因为视图不必占据整个屏幕。
如果你想要一个视图的最顶层子视图,你可以调用
[yourView subviews];
并取最后一个(它们按显示顺序,最前面最后一个)
[[yourView subviews] objectAtIndex:[[yourView subviews] count]];
编辑:这更好(来自 cmets)
[[yourView subviews] lastObject];
如果您知道显示的 viewController,只需将 yourView 替换为 yourController.view
【讨论】:
yourView 是什么?
这样
UIView *topMost = [[self.view subviews] lastObject];
【讨论】:
或者像这样
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
【讨论】: