【问题标题】:iOS - Get location of a view in a window?iOS - 在窗口中获取视图的位置?
【发布时间】:2011-08-11 15:44:50
【问题描述】:

我有一个 UIView,它在被点击后会显示一个弹出窗口。 需要将弹出窗口添加到主 UIWindow 以确保它位于其他所有内容之上。

我希望这个弹出窗口的位置是相对于我的 UIView,所以我需要知道我的 UIView 在窗口中的相对位置。

问题:当 UIView 不直接在 UIWindow 中(它在我的 viewController 的视图内)时,如何在 UIWindow 中找到 UIView 的位置?

【问题讨论】:

    标签: iphone objective-c ios uiwindow


    【解决方案1】:

    使用可以使用UIView方法covertRect:toView来转换到新的坐标空间。我做了非常相似的事情:

    // Convert the co-ordinates of the view into the window co-ordinate space
    CGRect newFrame = [self convertRect:self.bounds toView:nil];
    
    // Add this view to the main window
    [self.window addSubview:self];
    self.frame = newFrame;
    

    在我的示例中,self 是一个从其 superView 中删除并添加到窗口顶部的视图。 toView 中的 nil 参数:表示使用窗口而不是特定视图。

    希望这会有所帮助,

    戴夫

    【讨论】:

    • 完美。如果需要,有几种方法可以在坐标空间之间进行转换。
    • 当视图在 UIScrollView 内时是否有效
    • @AntiMoron,是吗?考虑到已经过去的时间,还是您应该遍历从一帧转换到另一帧然后是窗口?
    • 应该可以了,也看到nil参数表示使用窗口而不是特定视图,所以不需要遍历。
    • 不应该把convertRect方法传给self.frame,而不是传self.bounds吗?为什么要转换边界的矩形,它(几乎)总是有原点 0,0?
    【解决方案2】:

    您可以要求您的.superview为您转换您的origin

    CGPoint originGlobal = [myView.superview convertPoint:myView.frame.origin 
                                                   toView:nil];
    

    【讨论】:

      【解决方案3】:

      UIView 的 convertPoint:toView: 不起作用吗?所以:

      CGPoint windowPoint = [myView convertPoint:myView.bounds.origin toView:myWindow];
      

      【讨论】:

        【解决方案4】:

        我需要在 Xamarin.iOS

        中执行此操作

        对于任何在那里寻找解决方案的人来说,最终对我有用的是:

        CGRect globalRect = smallView.ConvertRectToView(smallView.Bounds, rootView);
        

        【讨论】:

        • 这很有帮助
        【解决方案5】:

        Swift 5 实用程序

        extension UIView {
            var originOnWindow: CGPoint { return convert(CGPoint.zero, to: nil) }
        }
        

        用法

        let positionOnWindow = view.originOnWindow
        

        UIScrollView 略有不同

        extension UIScrollView {
            var originOnWindow: CGPoint { return convert(contentOffset, to: nil) }
        }
        

        【讨论】:

          【解决方案6】:

          以下 Xamarin.iOS 实现对我有用。

              CGRect GetRectAsPerWindow(UIView view)
              {
                  var window = UIApplication.SharedApplication.KeyWindow;
                  return view.Superview.ConvertRectToView(view.Frame, window);
              }
          

          传入您想要相对于 Window 的框架的视图。

          【讨论】:

            【解决方案7】:
            CGRect myFrame = self.superview.bounds;
            

            【讨论】:

            • ader 如果我是你,我会删除这个答案。很多反对票..
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-19
            • 2018-10-26
            • 1970-01-01
            • 1970-01-01
            • 2013-01-20
            相关资源
            最近更新 更多