1
我在应用程序窗口的坐标中有一个CGPoint点。
有没有办法获得一个指向视图可见的指针?在某个点获取可见视图
例如我有100个视图或随机大小,并放置在随机位置 - 部分/完全覆盖对方。
按下应用程序中的按钮将列出(0,0),(100,100)和(200,200)处可见视图的地址。
视图可能会或可能不会启用userInteraction。
另外,一个视图被完全透明的视图覆盖的更复杂场景呢?
我在应用程序窗口的坐标中有一个CGPoint点。
有没有办法获得一个指向视图可见的指针?在某个点获取可见视图
例如我有100个视图或随机大小,并放置在随机位置 - 部分/完全覆盖对方。
按下应用程序中的按钮将列出(0,0),(100,100)和(200,200)处可见视图的地址。
视图可能会或可能不会启用userInteraction。
另外,一个视图被完全透明的视图覆盖的更复杂场景呢?
更新
hitTest
,因为它不会给你的子树而父母有userInteractionEnabled
设置为NO
或视图是其父的范围之外将无法正常工作。
visibleViewAtPoint
如下所述将解析整个视图树并为视图提供最高的子视图索引。这应该给正确的观点(不带Z顺序考虑...)
- (void) findView:(UIView**)visibleView atPoint:(CGPoint)pt fromParent:(UIView*)parentView
{
UIView *applicationWindowView = [[[[UIApplication sharedApplication] keyWindow] rootViewController] view];
if(parentView == nil) {
parentView = applicationWindowView;
}
for(UIView *view in parentView.subviews)
{
if((view.superview != nil) && (view.hidden == NO) && (view.alpha > 0))
{
CGPoint pointInView = [applicationWindowView convertPoint:pt toView:view];
if([view pointInside:pointInView withEvent:nil]) {
*visibleView = view;
}
[self findView:visibleView atPoint:pt fromParent:view];
}
}
}
- (UIView*) visibleViewAtPoint:(CGPoint)pt
{
UIView *visibleView = nil;
[self findView:&visibleView atPoint:pt fromParent:nil];
return visibleView;
}
目前该代码未检测到UIAlertView中,或如UIPickerView等“弹出的意见多数民众赞成窃听后呈现UIWebView中的下拉列表。这个代码是可以修改的,还是属于“超出父级范围的视图”的情况?如果是后者,您还能如何检测和检索这些视图? –
UIAlertView维护它自己的UIScreen,它将在视图控制器视图之外,所以这种方法不适用于此。您可能需要追踪UIAlertView的屏幕(以某种方式)并在那里执行此方法。 –