将UIView原点转换为其Window坐标系

时间:2010-07-10 13:19:51

标签: ios uiview coordinate-systems uiwindow

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

3 个答案:

答案 0 :(得分:54)

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

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

然而,将零点从视图本身转换为窗口更为简单。这两段代码是等价的,因此根本不需要使用原点。

[self convertPoint:CGPointZero toView:theWindow];

答案 1 :(得分:10)

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

答案 2 :(得分:6)

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

此代码对我有用:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

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