【问题标题】:Convert a UIView origin point to its Window coordinate system将 UIView 原点转换为其 Window 坐标系
【发布时间】:2011-03-14 06:09:56
【问题描述】:

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

【问题讨论】:

  • Swift 版本低于

标签: ios uiview coordinate-systems uiwindow


【解决方案1】:

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

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

但是,将零点从视图本身转换到窗口更简单。两段代码是等价的,所以根本不需要使用原点。

[self convertPoint:CGPointZero toView:theWindow];

【讨论】:

  • 我在 viewDidLoad 方法中尝试了这段代码,将 self 替换为 self.view 并将 theWindow 替换为 self.view.window,但它给出了 (0,0) 作为输出跨度>
  • 我会检查视图的 window 属性是否不为零。经常这样。
  • 感谢您的回复。如何处理这个问题。我尝试用 [UIApplication sharedApplication].keywindow 替换 self.view.window 但无济于事。
  • @Nishit 你应该在 viewDidAppear 中尝试一下,在 viewDidLoad 元素还没有分层...
【解决方案2】:

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

【讨论】:

  • 有任何解决方案>?我也有同样的问题
【解决方案3】:

请注意,这些功能仅在视图控制器完成子视图布局后才起作用。因此,如果您希望在视图加载时使用 viewDidLayoutSubviews / viewDidAppear,但不能在 viewDidLoad / viewWillAppear 等中使用...

这段代码对我有用:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

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

【讨论】:

    【解决方案4】:

    斯威夫特:

    在 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)")
    

    【讨论】:

    • 在 Swift 3 中:var yourFrame = yourScrollView.convertRect(yourScrollView.frame, to: self.view)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多