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

问题描述 投票:30回答:4

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

ios uiview coordinate-systems uiwindow
4个回答
55
投票

听起来您没有在正确的视图之间转换。视图的框架设置为其父视图的坐标,而不是其自身的内部坐标,因此,如果您试图将视图的原点转换为窗口坐标,则需要使用父视图:

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

但是,将零点从视图本身转换为窗口甚至更简单。这两段代码是等效的,因此根本不需要使用源代码。

[self convertPoint:CGPointZero toView:theWindow];

10
投票

我尝试使用TechZen解决方案,但无济于事。我没有转换scrollView的原点,而是使用apple docs UIWindow类Reference,并使用此代码[self.view convertPoint:endCentre fromView:[UIApplication sharedApplication].keyWindow]将键盘的endCenter转换为视图的坐标系。这段代码有效,因此解决了我的问题。 但是,问题仍然是为什么它没有给出正确的scrollView.origin坐标。因此,基本上,我得到了一种解决方法,方法是转换键盘的中心距而不是scrollView.origin。哦,我正在做所有这些事情,以便在键盘出现在屏幕上时计算scrollView的新高度。因此,如果有人对此问题有解决方案或更好的解决方案,请告知我们所有人。


6
投票

请注意,这些功能仅在视图控制器完成对子视图的布局后才能使用。因此,如果希望在加载视图时使用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)")
© www.soinside.com 2019 - 2024. All rights reserved.