有一种简单的方法可以获得UIView的绝对点吗?绝对的意思是UIView在iPad上相对于1024x768的位置?
我需要一个简单的方法,因为我在UITableView内部的UITutView内部有一个UIButView,它由一个viewcontroller呈现,该视图控制器是另一个视图控制器的子节点,重复到第五或第六个视图控制器。 由于这种复杂的设计,我需要UIButton的绝对矩形,所以我可以在“主”视图控制器上显示一个UIActionSheet。
答案 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
这会将接收器坐标系(您的按钮)中的一个点转换为指定视图(顶层视图)的点。
答案 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