Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS中从x,y查找对象_Ios_Uiviewcontroller_Coordinates - Fatal编程技术网

在iOS中从x,y查找对象

在iOS中从x,y查找对象,ios,uiviewcontroller,coordinates,Ios,Uiviewcontroller,Coordinates,当iOS中给出(x,y)坐标时,如何找到窗口中存在的UIElement?我将拥有一个具有许多UI元素的视图控制器,并且我将得到x,y,我必须用它来查找视图中存在的元素。一个视图可能在给定的CGPoint上有多个视图。此方法应返回在给定点存在的数组子视图 -(NSArray*)viewsAtPoint:(CGPoint)point inView:(UIView*)view { NSArray *subviews = view.subviews; NSMut

当iOS中给出(x,y)坐标时,如何找到窗口中存在的UIElement?我将拥有一个具有许多UI元素的视图控制器,并且我将得到x,y,我必须用它来查找视图中存在的元素。

一个视图可能在给定的
CGPoint
上有多个视图。此方法应返回在给定点存在的数组子视图

   -(NSArray*)viewsAtPoint:(CGPoint)point inView:(UIView*)view {
         NSArray *subviews = view.subviews;
         NSMutableArray *mutableArray = [[NSMutableArray alloc]init];
         for(UIView *subview in subviews) {
            CGPoint thisSubviewPoint = subview.frame.origin;
            if(thisSubviewPoint.x == point.x && thisSubviewPoint.y == point.y) {
             [mutableArray addObject:subview];
            }
         }
         return mutableArray;
      }

要获取特定点的视图列表,可以使用

-(NSArray*)subviewsAtPoint:(CGPoint)point inView:(UIView*)view {

    NSMutableArray *viewsAtPoint = [[NSMutableArray alloc]init];
    for(UIView *subview in view.subviews) {

        if(CGRectContainsPoint(subview.frame, point))
            [viewsAtPoint addObject:subview];
    }
    return viewsAtPoint;
}
要获取特定点的最顶层视图,可以使用

-(UIView *)topmostViewAtPoint:(CGPoint)point inView:(UIView*)view {

    for(UIView *subview in view.subviews.reverseObjectEnumerator) {

        if(CGRectContainsPoint(subview.frame, point))
            return subview;
    }
    return view;
}
上面的代码假设只有一级子视图,并且没有嵌套的子视图

如果有嵌套的子视图,可以定义递归函数来查找最顶层的视图

-(UIView *)topmostViewAtPoint:(CGPoint)point inView:(UIView*)view {

    for(UIView *subview in view.subviews.reverseObjectEnumerator) {

        if(CGRectContainsPoint(subview.frame, point))
        {
            CGPoint innerPoint = [self.view convertPoint:point toView:subview];
            [self topmostViewAtPoint:innerPoint inView:subview];
        }
     }
    return view;
}
if(mutableArray.count!=0){firstView=[mutableArray objectAtIndex:0];}