将UIView原点转换为其Window坐标系
我想在窗口坐标系中获取scrollView的原点。 例如,目前,scollView的来源是(0,51)。 但在窗口坐标系中,它应该是51 + 44(导航栏高度)+20(状态栏高度)= 115。在窗口坐标系中,scrollView.frame.origin应该是(0,115)。 我尝试使用convertPoint:方法,但有时得到(0,51)或(0,0)。 请为此提供解决scheme。 谢谢
这听起来像你不转换适当的意见。 一个视图的框架设置为它的超级视图的坐标,而不是它自己的内部坐标,所以如果你试图将视图的原点转换成窗口坐标,你需要使用超级视图:
[[self superview] convertPoint:self.frame.origin toView:theWindow];
但是,将视图本身的零点转换为窗口更为简单。 这两个代码是等价的,所以根本不需要使用原点。
[self convertPoint:CGPointZero toView:theWindow];
我尝试与TechZen解决scheme,但无济于事。 而不是转换scrollView的起源,我引用苹果文档UIWindow类参考,并通过使用此代码[self.view convertPoint:endCentre fromView:[UIApplication sharedApplication].keyWindow]
将键盘的endCenter转换到我的视图的坐标系统。 这段代码工作,因此解决了我的问题。 然而,问题仍然是为什么它没有给出scrollView.origin.So,适当的坐标,基本上我通过转换键盘endcenter而不是scrollView.origin解决方法 。 哦,我正在做所有这些东西,以便计算我的scrollView的新高度,当键盘出现在屏幕上。 所以,如果有人有解决这个问题或更好的解决scheme,请让我们所有人知道。
请注意,这些function只能在视图控制器完成子视图布局后才能使用。 所以,如果你想要当视图加载,你可以使用viewDidLayoutSubviews / viewDidAppear,但不是在viewDidLoad / viewWillAppear等…
这段代码适用于我:
- (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; CGPoint originInSuperview = [self.view.superview convertPoint:CGPointZero fromView:self.scrollView]; }
Swift 2.1:
在您的ViewController的viewDidAppear(否则元素尚未分层):
var yourFrame = yourScrollView.convertRect(yourScrollView.frame, toView: 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)")