- 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];
}
}
}
}
}
任何人都可以解释一下吗?
来自问题:
myWindow = [[myWindow alloc] initWithFrame:[[UIScreen mainScreen] nativeBounds]];
application: application didFinishLaunchingWithOptions: launchOptions
创建
CAEAGLLayer
图层答案 0 :(得分:1)
每个视图都有一个contentScaleFactor属性。它旨在简化不同设备分辨率的工作(例如视网膜(@ 2x),非视网膜(@ 1x),@ 3x等)
UIWindow
是UIView
的子类,所以它也有它。
比例因子决定了视图中内容的映射方式 逻辑坐标空间(以点为单位)到设备坐标 空间(以像素为单位)。该值通常为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];