【问题标题】:Retrieving all 4 coordinates of a rotated UIImageView检索旋转的 UIImageView 的所有 4 个坐标
【发布时间】:2011-04-03 14:55:22
【问题描述】:

如何获得 UIImageView 的 4 个坐标?

我知道可以得到CGRect和origin.x和origin.y,但是怎么才能找到所有4个角呢?

编辑:我正在旋转 UIImageViews,这就是我问的原因:P

【问题讨论】:

    标签: iphone cocoa-touch


    【解决方案1】:

    您可以添加矩形的宽度和高度以获取其他 3 个点的坐标。

    CGRect rect = view.bounds;
    
    CGPoint topLeft = rect.origin;
    CGPoint topRight = CGPointMake(rect.origin.x + rect.size.width, rect.origin.y);
    CGPoint bottomLeft =CGPointMake(rect.origin.x, rect.origin.y + rect.size.height);
    CGPoint bottomRight = CGPointMake(rect.origin.x + rect.size.width,
                                      rect.origin.y + rect.size.height);
    

    然后您可以使用 CGPointApplyAffineTransform 来获取它们在您指定的变换下的变换坐标。

    CGPoint center = view.center;
    CGAffineTransform transf = CGAffineTransformMakeTranslation(-rect.size.width/2,
                                                                -rect.size.height/2);
    transf = CGAffineTransformConcat(transf, view.transform);
    transf = CGAffineTransformTranslate(transf, center.x, center.y);
    
    topLeft = CGPointApplyAffineTransform(topLeft, transf);
    //...
    

    (注意:未测试。)

    【讨论】:

      【解决方案2】:

      这是我的解决方案:

      • [self]UIImageView 的子类
      • [self.transform] 是我对[self] 所做的转换:

        CGAffineTransform transform = CGAffineTransformMakeTranslation(-center.x, -center.y);
        transform = CGAffineTransformConcat(transform, self.transform);
        CGAffineTransform transform1 = CGAffineTransformMakeTranslation(center.x, center.y);
        transform = CGAffineTransformConcat(transform, transform1);
        
        CGPoint leftTopPoint     = CGPointApplyAffineTransform(leftTopPoint, transform);
        CGPoint rightTopPoint    = CGPointApplyAffineTransform(rightTopPoint, transform);
        CGPoint rightBottomPoint = CGPointApplyAffineTransform(rightBottomPoint, transform);
        CGPoint leftBottomPoint  = CGPointApplyAffineTransform(leftBottomPoint, transform);
        

      【讨论】:

        【解决方案3】:

        你可以得到size.width和size.height。将它们添加到 x 和 y 将为您提供其他坐标。

        【讨论】:

        • 我忘了说我正在旋转 imageViews。
        • 您必须自己计算。 origin.x 和 origin.y 也不正确。
        • 好吧,我在旋转后从 imageVIew 创建一个 CGRect 并获取原点,但需要获取其他 2 个坐标。
        【解决方案4】:

        虽然这些(当然)与超级视图相关,但您可以使用frame 属性来获取包含 UIImageView 的原点和大小的CGRect。然后,您只需将相关尺寸添加到相关原点即可获得完整的坐标集。

        有关详细信息,请参阅UIView 类参考中的框架部分。

        【讨论】:

        • 我编辑了我的问题。是的,我做了你提到的事情,但我正在寻找旋转、转换后的 imageView 的坐标
        【解决方案5】:

        构造一个旋转矩阵http://en.wikipedia.org/wiki/Rotation_matrix。您应该计算角相对于旋转中心点的初始位置。将这些位置存储在一个数组中并一直保留它们。您可以通过在 2x2 旋转矩阵中传递角度并将它们与初始位置相乘来计算新位置。

        【讨论】:

        • 好吧,比我想象的还要多做一些工作。我还需要使用 NSKeyedArchiver 存储 UIImageViews。所以基本上,如果我在应用程序执行期间存档它们,然后在重新启动时取消存档,除非我这样做并将其与图像一起存储,否则不会有任何关于图像视图坐标的数据?
        • 我猜你也必须存档你的新坐标:)
        【解决方案6】:

        好吧,如果你知道旋转的角度,这是获得右上角 y 坐标的数学:

        Sin (angle of rotation) = height difference y / width
        

        因此,如果您将矩形旋转 10 度并且其宽度为 20pt:

        Sin 10 = yDiff / 20
        

        这意味着你可以这样做:

        yDiff = Sin 10 * 20
        

        这为您提供了从原点的 y 坐标到右上角的 y 坐标的 y 差异。将此值添加到矩形的当前 y 原点,以获得右上角的实际 y 坐标。下一步是在宽度和 yDiff 上使用 pythagoras 来获取 xDiff 并执行相同操作(将其添加到 x 坐标)以获取右手角的 x 坐标。我希望这是有道理的。

        现在您只需要对每个角再次执行此操作 - 如果您愿意,想象一下矩形已旋转 90 度,您可以重新应用逻辑,但是 x 是 y,反之亦然。 :) 等等

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-16
          相关资源
          最近更新 更多