将UIView的原点坐标转换为其窗口坐标系

35

我想获取scrollView在窗口坐标系中的原点。例如,当前scrollView的原点是(0,51)。但在窗口坐标系中应该是51 + 44(导航栏高度)+ 20(状态栏高度)= 115。这意味着在窗口坐标系中,scrollView.frame.origin 应该为(0,115)。我尝试使用 convertPoint: 方法,但有时会得到 (0,51) 或 (0,0)。请提供解决方案。谢谢


下面是Swift版本 - Juan Boero
4个回答

59

听起来你没有在正确的视图之间进行转换。一个视图的frame是设置为其父视图的坐标,而不是它自己的内部坐标。因此,如果你想将一个视图的原点转换为窗口坐标,你需要使用父视图:

[[self superview] convertPoint:self.frame.origin toView:theWindow];

不过,将视图中的零点转换为窗口中的零点更加简单。这两段代码等效,因此完全不需要使用原点。

[self convertPoint:CGPointZero toView:theWindow];

我在viewDidLoad方法中尝试了这段代码,将self替换为self.view,将theWindow替换为self.view.window,但输出结果为(0,0)。 - Nishit
我会检查视图的窗口属性是否为nil。它经常是这样的。 - TechZen
1
谢谢您的回复。如何解决这个问题。我尝试用 [UIApplication sharedApplication].keywindow 替换 self.view.window,但没有效果。 - Nishit
@Nishit 你应该在 viewDidAppear 中尝试它,在 viewDidLoad 中元素尚未被分层... - Juan Boero

10

我尝试了TechZen的解决方案,但没有成功。我参考了苹果文档UIWindow class Reference,使用了这段代码将键盘的endCenter转换为我的视图坐标系:[self.view convertPoint:endCentre fromView:[UIApplication sharedApplication].keyWindow]。这段代码起作用了,因此解决了我的问题。 然而,问题仍然存在,为什么它不能给出scrollView.origin的正确坐标。所以,基本上我通过转换键盘的endcenter而不是scrollView.origin来得到了一个解决方法。哦,我在计算当键盘出现在屏幕上时,我的scrollView的新高度。因此,如果有人有解决这个问题的方法或任何更好的解决方案,请告诉我们。


1
有解决方案吗?我也遇到了同样的问题。 - Jasmeet

7
请注意,这些函数仅在视图控制器完成布局子视图后才能起作用。因此,如果您希望在视图加载时使用这些函数,可以使用viewDidLayoutSubviews/viewDidAppear,而不是viewDidLoad/viewWillAppear等...。
以下代码对我有效:
- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    CGPoint originInSuperview = [self.view.superview convertPoint:CGPointZero fromView:self.scrollView];
}

3

Swift:

在您的ViewController的viewDidAppear方法中(否则元素尚未被分层):

        var yourFrame = yourScrollView.convertRect(yourScrollView.frame, to: self.view)

        //PRINT THE WHOLE RECT
        print(yourFrame)

        //PRINT A DETAILED VERSION OF THE FRAME, ALSO CAN PERFORM CALCULATION BETWEEN THE RECT PARAMETERS TO GET , FOR EXAMPLE, WIDTH POINT IN THE SUPERVIEW:
        print("X: \(yourFrame.origin.x) Y: \(yourFrame.origin.y) WIDTH: \(yourFrame.width) HEIGHT: \(yourFrame.height)")

4
在Swift 3中:var yourFrame = yourScrollView.convert(yourScrollView.frame, to: self.view)将yourScrollView的矩形框架转换为在self.view中的坐标系下的矩形框架,并将结果存储在yourFrame变量中。 - Medhi

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