convertPoint toView无法获取屏幕上的绝对位置

3

我已经多次阅读了这篇iPhone - Get Position of UIView within entire UIWindow及其他相关文章,但我的应用程序无法输出屏幕上某个元素的绝对位置。

我有一个滚动视图,它在跳跃,我想找出原因。 我想检查它在屏幕上的位置(而不是相对于其父视图的框架)。 我尝试了以下方法:

CGPoint point = [scrollView.superview convertPoint:scrollView.frame.origin toView:nil];
NSLog(@"point is %f", point.y);

尽管滚动视图实际上不在我的屏幕上,它大约在屏幕的三分之一处,但控制台显示滚动视图的Y位置为0。这种方法不会给出绝对的320x568屏幕中某个位置的坐标吗?我相信这只是一些小问题,但有人能指出我错过了什么吗?


谢谢帮忙!我之前就有这个想法,所以我在nib中对ScrollView进行了阴影处理,以确保它实际上是ScrollView本身在移动。我只是觉得捕捉屏幕上某些绝对位置很容易,但我肯定有其他问题导致convertPoint无法工作。 - skinsfan00atg
你在哪个地方尝试获取屏幕坐标?是在viewDidLoad中吗? - yurish
1
如果您在启动时显示滚动视图,可以尝试将此代码放置在 viewDidAppear 中。 - yurish
搞定了!现在我可以在屏幕上看到真实的位置了。所以要使用它,我猜至少在设置中必须达到这个点吧?我把它放在其他方法里面,但是它不起作用。也许我需要从“didappear”调用一些东西。 - skinsfan00atg
当视图控制器的根视图已附加到视图层次结构中时(这对于成功转换是必要的),vieDidLoad被调用,我不知道是否有任何其他方法在根视图附加之前被调用。 - yurish
显示剩余2条评论
2个回答

4

UIScrollView 具有一个名为 contentOffset 的属性。如果您想知道绝对位置,需要取视图(在滚动视图中的)的位置并减去滚动视图的 contentOffset


非常感谢您的回复。实际上,我正在尝试获取滚动视图本身的位置,而不是其中的任何内容。如果我只想知道滚动视图在屏幕上的位置,我是否仍然需要考虑偏移量? - skinsfan00atg
不,偏移量只影响滚动视图的子视图。 - Guy Kogus

-1
UIView *parentview = [[UIApplication sharedApplication] window].rootViewController.view; CGPoint point = [parentview convertPoint:scrollView.frame.origin toView:nil]; NSLog(@"point is %f", point.y);

1
@AndrewGray 在 Windows 上使用 Window 而不是 Windows。你只需要 keyWindow。以下是获取它的替代方法。https://dev59.com/mW865IYBdhLWcg3wfuwk - Kunal Balani
好的,窗口给了我一个异常,但是我尝试了关键窗口,它可以运行。不幸的是,控制台仍然显示0。我不确定发生了什么。也许我的nib有问题,我需要继续挖掘。 - skinsfan00atg
你的视图层次结构是什么?你可以使用UIView的属性subviews进行检查。 - Kunal Balani
发布的代码有问题。它没有实现任何有意义的功能。 - Nikolai Ruhe
我不确定你所说的“ans”是什么意思,但这是我的批评:您正在错误地转换坐标。parentView无法转换scrollView的父视图的坐标,因为它们处于不同的坐标系统中。convertPoint:toView:的整个重点在于目标视图将其自己坐标系中的点解释并转换为目标视图。选择某个任意视图并要求它对不相关的坐标系中的点进行转换就没有意义了。 - Nikolai Ruhe
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接