iOS:UIView 相对于 UIWindow 的起源

Posted

技术标签:

【中文标题】iOS:UIView 相对于 UIWindow 的起源【英文标题】:iOS: UIView's origin with respect to UIWindow 【发布时间】:2011-11-10 17:47:48 【问题描述】:

一个 UIView 在它的 frame 或 bounds 属性中包含一个相对于它的 superview 的原点。假设我想做一些相对于 UIWindow 抓取 UIView 起源的事情。为了进行这个计算,我是否必须在层次结构的每一步上进行,还是有更简单、更直接的方法?

【问题讨论】:

您到底想对视图做什么?你是说触摸/拖动它吗? 我想以不同的方式显示 UIImage。基本上我希望能够让用户点击图像,然后让它接管全屏以显示图像,当用户完成后,它将恢复 UIView 原来的样子。我的描述有意义吗? 您可能会发现创建另一个跨全屏的视图并在该视图中显示图像更容易。您可以在不改变原始视图或原始视图的行为的情况下确定您希望如何呈现该视图(例如隐藏/取消隐藏或动画)。那么你只需要一些代码来管理这个独立于管理原始视图的代码的新视图。 【参考方案1】:

我猜你正在寻找这种方法

convertPoint:toView

【讨论】:

【参考方案2】:

要找出视图 aView 在应用程序窗口中的位置,请尝试

[aView convertRect:aView.frame toView:[UIWindow screen]]

这个方法在UIView Class Reference

【讨论】:

注意:原点 - 是一个点(CGPoint)。所以,改用convertPoint 方法 糟糕!我错过了。您确定了正确的方法。使用上面的表格与 convertPoint 而不是 convertRect。【参考方案3】:

最好和最简单的方法是在UIWindow 上使用convertPoint:toViewconvertRect:toView。为了正确执行此操作,您需要提供一个视图,其窗口与您尝试转换其坐标的视图的窗口匹配。

对于您的问题,您需要了解视图在窗口中位置的来源。值得庆幸的是,您无需知道窗口即可获得此信息。根据UIViewconvert:to方法的文档。

要转换到其坐标系点的视图。如果 view 为 nil,则此方法将转换为窗口基坐标。否则,视图和接收者必须属于同一个 UIWindow 对象。

这意味着您只需提供nil 即可满足您的需求!

在斯威夫特中:

let pointInWindow = yourView.convert(.zero, to: nil)

在 Objective-C 中:

CGPoint pointInWindow = [yourView convertPoint:CGPointZero toView:nil];

【讨论】:

以上是关于iOS:UIView 相对于 UIWindow 的起源的主要内容,如果未能解决你的问题,请参考以下文章

iOS小技能:特殊的UIView(UIWindow)

iOS开发-UI 补充 UIWindow UIView UIlabel

IOS开发之视图和视图控制器

CGPoint 相对于视图

访问 UIView/UIWindow 以获得小蓝色自动更正框

iOS系统自带的 UIAlertView 自动旋转的实现