iOS触摸坐标系

时间:2016-02-24 01:35:37

标签: ios

  
      
  • locationInView:返回给定视图坐标系中接收器的当前位置。
  •   
     

此方法返回UITouch对象的当前位置   指定视图的坐标系。因为触摸物体   可能已从另一个视图转发到视图,此方法   执行任何必要的触摸位置转换为   指定视图的坐标系。

    - (void)sendEvent:(UIEvent *)event
    {
        if([event type] == UIEventTypeTouches)
        {
            NSSet<UITouch *> *allTouches = [event allTouches];
            if(allTouches)
            {
                for(UITouch* touch in allTouches)
                {
                    if([touch type] == UITouchTypeDirect)
                    {
                         // This is 640x1136
                         CGRect bounds = [myWindow bounds];

                         // This is in [318x560] empirically 
                         CGPoint origin = [touch locationInView:myWindow];
                    }
                }    
            }    
        }
    }

任何人都可以解释一下吗?

来自问题:

  1. 在物理iPhone 6设备上进行测试。
  2. myWindow是应用程序的主窗口。在myWindow = [[myWindow alloc] initWithFrame:[[UIScreen mainScreen] nativeBounds]];
  3. 期间使用application: application didFinishLaunchingWithOptions: launchOptions创建
  4. myWindow没有子视图。只有CAEAGLLayer图层

1 个答案:

答案 0 :(得分:1)

每个视图都有一个contentScaleFactor属性。它旨在简化不同设备分辨率的工作(例如视网膜(@ 2x),非视网膜(@ 1x),@ 3x等) UIWindowUIView的子类,所以它也有它。

  

比例因子决定了视图中内容的映射方式   逻辑坐标空间(以点为单位)到设备坐标   空间(以像素为单位)。该值通常为1.0或2.0。   较高比例因子表明视图中的每个点都是   由底层中的多个像素表示。对于   例如,如果比例因子是2.0并且视图框架大小是50 x 50   点,用于呈现该内容的位图的大小是100 x   100像素。

     

此属性的默认值是关联的比例因子   屏幕当前显示视图。如果您的自定义视图   实现自定义drawRect:方法并与窗口关联,   或者如果您使用GLKView类来绘制OpenGL ES内容,那么您的视图   绘制屏幕的全分辨率。对于系统视图,   即使在高分辨率屏幕上,此属性的值也可能为1.0。

因此,在您的情况下,[myWindow bounds]返回的逻辑大小等于设备屏幕大小,因为您将其设置为本机边界。您的窗口比根据其比例因子(等于2)从其逻辑坐标计算的设备坐标中的屏幕大两倍,并且您的触摸仅触及它的第四部分。

myWindow = [[myWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
myWindow.layer.contentsScale = [[UIScreen mainScreen] nativeScale];

CGPoint origin = [touch locationInView:myWindow];
origin.x *= [[UIScreen mainScreen] scale];
origin.y *= [[UIScreen mainScreen] scale];               
相关问题