UIView绝对屏幕点

时间:2015-03-04 20:02:53

标签: ios objective-c uiview cgrect

有一种简单的方法可以获得UIView的绝对点吗?绝对的意思是UIView在iPad上相对于1024x768的位置?

我需要一个简单的方法,因为我在UITableView内部的UITutView内部有一个UIButView,它由一个viewcontroller呈现,该视图控制器是另一个视图控制器的子节点,重复到第五或第六个视图控制器。 由于这种复杂的设计,我需要UIButton的绝对矩形,所以我可以在“主”视图控制器上显示一个UIActionSheet。

7 个答案:

答案 0 :(得分:8)

所以,我们有一个让我们称之为小视图的内部有一定的观点。该点相对于其小视图的父视图具有本地坐标。 现在,我们想知道,该点的坐标,如果它将保留在屏幕上的同一位置,但它将成为根视图的一部分。 (这有效地为我们提供了相对于整个屏幕的坐标。)

您将计算该点的全局坐标

CGPoint globalCoordinates = [self.smallView convertPoint:localCoordinatesOfThePoint 
                                                  toView:self.view];

localCoordinatesOfThePoint也是CGPoint结构。

另一种情况

当您使用根视图覆盖整个屏幕时,它有一个大视图(尽管仍然比根视图小),并且这个大视图有一个小视图作为其中的子视图。

您将计算小视图提示的位置

CGPoint originOnScreen = [self.smallView convertPoint:self.smallview.origin 
                                               toView:self.view];

self.smallview.origin是一个相对于大视图的CGPoint。因此,我们计算,如果这一点(它实际上是小视图的左上角)将在根视图内,它的坐标是什么。

<强> CATCH

如果根视图不是全屏,而不是根视图,我们需要获得对主窗口的引用,因为这将是我们现在计算坐标的视图。

我们必须

#import "AppDelegate.h"

在我们计算的类中,然后将window属性作为参考视图传递。保证窗口覆盖屏幕,UIWindow是UIView的子类。所以它才有用。

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

CGPoint originOnScreen = [self.smallView convertPoint:self.smallview.origin 
                                               toView:appDelegate.window];

答案 1 :(得分:1)

如果您想在某个CGPoint中获取CGRect / UIView的坐标,可以使用UIView方法

- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view

CGRect

- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view

在第一个参数中放置了要转换的CGPoint / CGRect,在第二个参数中放置了要转换为的UIView

答案 2 :(得分:1)

您正在寻找的是:

- (CGPoint)convertPoint:(CGPoint)point
                 toView:(UIView *)view

这会将接收器坐标系(您的按钮)中的一个点转换为指定视图(顶层视图)的点。

Documentation

答案 3 :(得分:0)

所以我最终改为使用UITapGestureRecognizer并计算这样的位置:

    CGPoint gestureViewLocation = [gesture locationInView:gesture.view];
    CGPoint absoluteLocation = [gesture locationInView:self.parentViewController.view];
    CGRect fromRect = CGRectMake(absoluteLocation.x-gestureViewLocation.x, //subtract to we get point relative to gesture view
                                 absoluteLocation.y-gestureViewLocation.y, //subtract to we get point relative to gesture view
                                 gesture.view.frame.size.width,
                                 gesture.view.frame.size.height);

答案 4 :(得分:0)

要从视图的本地框架或路径转换为SCREEN坐标,请使用内置转换器:

UIAccessibilityConvertPathToScreenCoordinates

UIAccessibilityConvertFrameToScreenCoordinates

这确实会返回路径或矩形,但您可以从中提取点。

答案 5 :(得分:0)

Swift 4转换似乎适用于两个以上级别的子视图:

// given that myView is in hierarchy of rootView, either
// have rootView convert its origin from myView, or
// have myView convert rootView's origin to rootView

rootView.convert(rootView.origin, from: myView)
var absView = myView.convert(rootView.origin, to: rootView)

我发现转换例程有些令人困惑。所以,我通过5级视图测试了所有可能的组合。结果为posted on github

[编辑]当rootView是UITableView时,请调整contentOffset:

 if let tableView = rootView as? UITableView {
        absView.y -= tableView.contentOffset.y
 }

答案 6 :(得分:0)

您可以使用以下方法实现任何视图的绝对框架:

func getAbsoluteFrame(of view: UIView, rootViewController: UIViewController) -> CGRect {
    guard let parentView = view.superview else {
        print("Super view of this view is nil")
        return view.frame
    }
    
    return rootViewController.view.convert(view.frame, from: parentView)
}

您可以像这样获取 rootViewController:

let rootViewController = UIApplication.shared.keyWindow!.rootViewController