目标:将UIView(一个小放大镜)放在导航控制器上方。它就像Notes程序中的放大镜一样。
我已使用以下代码部分完成此任务:
MyAppDelegate *app = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
[[[[app navigationController] view] superview] addSubview:_loupe];
这允许放大镜显示在导航控制器上方。注意:_loupe变量包含将放大视图的UIView实例。
此代码在Portrait中完美运行。但是,当我将方向更改为横向时,_loupe的坐标仍显示为纵向模式。
通过大量的试验和错误以及数小时的敲击,我意识到UINavigationController(作为应用程序的rootViewController添加)在方向更改时永远不会更新其坐标。所有其他视图,包括RootViewController(在XCode中创建新应用程序时创建的默认类)都更新了坐标。
我试图通过使用我自己的控制器继承UINavigationController来纠正这个问题,以便使导航控制器而不是RootViewController调用shouldAutorotateToInterfaceOrientation。我希望它不旋转的原因是因为它不是要求定向的控制器。什么都没有。
我还使用以下内容旋转_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轴(垂直),无论我移动触摸的方向。越来越近了!
答案 0 :(得分:1)
解决强>
就是这样:
CGPoint tPoint = [self convertPoint:point toView:[[[app navigationController] view] superview]];
我所要做的就是将从UITouch事件创建的CGPoint转换为导航控制器的superview(放大镜所属的)的坐标空间。