gpt4 book ai didi

objective-c - 如何在旋转的 UIView 中使用 CGRectContainsPoint()

转载 作者:可可西里 更新时间:2023-11-01 04:11:30 25 4
gpt4 key购买 nike

我有一个 UIView,用户可以点击 UIView 来“选择”或突出显示它所代表的应用内“事物”。我使用 CGRectContainsPoint(thing.frame,tapPoint) 来实现这一点,其中 thing.frameUIView 的框架,而 tapPoint 是来自 UITapGestureRecognizer 的点击点。这很完美。

..除非通过设置 transform 属性(使用 CGAffineTransform 值)旋转 UIView。当 UIView 像这样旋转时,frame 变成一个平面正方形,封装了旋转后的 View 。

下面是问题的说明(框架属性标记为 A,视觉 UIView bounds 标记为 B):

不旋转时

+------------------+
| A == B |
+------------------+

旋转时

+-----------------+
| A . |
| . . |
| . . |
| . . |
| . B . |
| . . |
| . . |
| . |
+-----------------+

我想捕获在 rect B 边界内的点击(UIView 的真实边界,已旋转),但当它们仅在 rect A(UIViewframe 属性的值)而不是 B

我如何计算给定的点击点是否在旋转的 UIView 的真实边界/框架/边界内?有没有方便的方法?或者我是否需要使用自己的几何图形计算 B 的坐标和尺寸?

(如果是后者,请提出建议,以便我们尽可能完善答案。谢谢!)

最佳答案

您正在发现每个人在第一次处理框架和边界时都会遇到的一个基本障碍。

框架是考虑到变换后适合 View 的最小可能(非旋转)矩形。这意味着,如果您要测试触摸,您可以记录 View 周围的可用空间,只要它在尽可能小的矩形内即可。

对于视觉效果,假设蓝色方 block 是转换后的 UIView。 View 周围的蓝色边框代表它的框架。请注意,即使 View 已转换,它的框架仍未转换并处于标准位置。绿色区域表示如果传递 frame 而不是 bounds 时可触摸的区域:

frame

另一方面,边界表示接收者相对于自身的矩形,考虑到变换,因此通过传递边界(在 -convertPoint:toView: 之后)测试 View 中的点call) 将正确返回给定触摸(点)是否与 View 相交。

关于objective-c - 如何在旋转的 UIView 中使用 CGRectContainsPoint(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14028811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com