目的:获得一个UIView,这是一个小放大镜,放置在导航控制器之上。就像“笔记”节目中的百叶窗。
我通过以下代码部分完成了这项任务:
MyAppDelegate *app = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
[[[[app navigationController] view] superview] addSubview:_loupe];这允许在导航控制器上方显示百叶窗。注意:_loupe变量包含一个将放大视图的UIView实例。
这段代码在“肖像”中运行得很好。然而,当我将方向改为景观时,_loupe的坐标似乎仍然处于纵向模式。
经过大量的反复尝试和几个小时的头部敲击,我意识到作为应用程序的rootViewController添加的rootViewController不会在方向发生变化时更新其坐标。所有其他视图,包括RootViewController (在XCode中创建新应用程序时创建的默认类)都更新了它们的坐标。
我试图通过使用自己的控制器对UINavigationController进行子类以使shouldAutorotateToInterfaceOrientation:由导航控制器而不是RootViewController调用来纠正这种情况。我希望它没有旋转的原因是因为它不是要求方向的控制器。没什么。
我还旋转了_loupe视图如下:
CGAffineTransform transform = _loupe.transform;
transform = CGAffineTransformMakeRotation([self degreesToRadians:90.0]);
_loupe.transform = transform;
_loupe.bounds = CGRectMake(0, 0, 480, 320);
_loupe.frame = CGRectMake(0, 0, 80, 80);这使得UIView,在触摸下面,放大了右侧。最初,当改变方向到左边时,下面的UIView是旋转的-90。所以我快到了..。但坐标还是搞砸了。
我还尝试将_loupe.bounds更改为CGRectMake(0,480,480,320),相信更改原点可能与底层坐标系相匹配。没有骰子。
我的最后一招是对实际的UITouch x/y点进行转换。
CGPoint point = [touch locationInView:self];
CGAffineTransform transform = CGAffineTransformRotate([_loupe transform], [self degreesToRadians:90.0]);
CGPoint tPoint = CGPointApplyAffineTransform(point, transform);没有骰子。然而,这确实使显示在可见区域附近的百叶窗。我发现,移动x轴上的触觉,在y轴上移动扬声器,在y轴上移动,在x轴上移动。所以现在它完全颠倒了。
简而言之,我只想要一种简单的方法,在导航控制器上方显示放大镜,而不需要所有这些繁琐的操作。
编辑
我把重点转到了百叶窗的视野上,离得更近了一点。
CGPoint tPoint = [self convertPoint:point toView:_loupe];这使得百叶窗闪烁很多..。它似乎也移动两个x&y轴(垂直)的百叶窗,无论我移动触摸的方向。不过越来越近了!
发布于 2012-12-03 23:13:18
分辨率
就是这样:
CGPoint tPoint = [self convertPoint:point toView:[[[app navigationController] view] superview]];我所要做的就是将从CGPoint事件创建的UITouch转换为导航控制器的超级视图的坐标空间(百叶窗是其中的一部分)。
https://stackoverflow.com/questions/8249022
复制相似问题