繁体   English   中英

在导航控制器上方添加放大镜

[英]Add magnifying glass above navigation controller

目标:要获得一个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转换为导航控制器的超级视图(放大镜是其一部分)的坐标空间的CGPoint。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM