目标:要获得一个UIView,这是一个小放大镜,将其放置在导航控制器上方。就像Notes程序中的放大镜一样。

我用以下代码部分完成了此任务:

MyAppDelegate *app = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
[[[[app navigationController] view] superview] addSubview:_loupe];

这允许将放大镜显示在导航控制器上方。注意:_loupe变量包含将放大视图的UIView的实例。

在纵向模式下,此代码可完美工作。但是,当我将方向更改为“横向”时,_loupe的坐标似乎仍处于纵向模式。

通过大量的试验和错误以及数小时的头部撞击,我意识到UINavigationController(作为应用程序的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轴上(垂直)移动。越来越近了!

最佳答案

分辨率

就是这个:

CGPoint tPoint = [self convertPoint:point toView:[[[app navigationController] view] superview]];

我要做的就是将通过UITouch事件创建的CGPoint转换为导航控制器的 super 视图(放大镜是其一部分)的坐标空间的CGPoint。

关于objective-c - 在导航 Controller 上方添加放大镜,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8249022/

10-13 02:47