应用UIView变换后查找帧坐标(CGAffineTransform)

编程入门 行业动态 更新时间:2024-10-25 21:19:08
本文介绍了应用UIView变换后查找帧坐标(CGAffineTransform)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我用旋转我的视图CGAffineTransform

[view setTransform:newTransform];

应用变换后帧值保持不变但如何找到旋转或变换后的值这个框架?

The frame values remain the same after transform is applied but how do I find "rotated" or transformed values of this frame?

http://www.informit / content / images / art_sadun_affine / elementLinks / sadun_fig02.png

我想要旋转帧边缘的精确坐标,即a,b,c ,d点。

I want the exact coordinates of rotated frame edges, that is a, b, c, d points.

推荐答案

要记住的一点是变换会改变坐标系,所以你需要做的能够在父视图和子(转换)视图之间进行转换。此外,变换保留变换对象的中心,但不保留任何其他坐标。所以你需要根据中心来计算事物。你需要几个助手。 (我从Erica Sadun的书籍Core iOS Developer's Cookbook中获得了以下大部分方法。)

One thing to keep in mind is that the transform changes the coordinate system, so you will need to be able to convert between the parent 'view' and the child (transformed) view. Also, transforms preserve the center of the transformed object but not any of the other coordinates. So you need to calculate things in terms of the center. And there are several helpers you will need. (I got most of the following approach from Erica Sadun's book Core iOS Developer's Cookbook).

我通常在UIView上添加这些作为类别。

I usually add these as a category on UIView.

为了将孩子的坐标转换为父母的坐标,您需要以下内容:

In order to transform the child's coordinates to those of the parent you need something like:

// helper to get pre transform frame -(CGRect)originalFrame { CGAffineTransform currentTransform = self.transform; self.transform = CGAffineTransformIdentity; CGRect originalFrame = self.frame; self.transform = currentTransform; return originalFrame; } // helper to get point offset from center -(CGPoint)centerOffset:(CGPoint)thePoint { return CGPointMake(thePoint.x - self.center.x, thePoint.y - self.center.y); } // helper to get point back relative to center -(CGPoint)pointRelativeToCenter:(CGPoint)thePoint { return CGPointMake(thePoint.x + self.center.x, thePoint.y + self.center.y); } // helper to get point relative to transformed coords -(CGPoint)newPointInView:(CGPoint)thePoint { // get offset from center CGPoint offset = [self centerOffset:thePoint]; // get transformed point CGPoint transformedPoint = CGPointApplyAffineTransform(offset, self.transform); // make relative to center return [self pointRelativeToCenter:transformedPoint]; } // now get your corners -(CGPoint)newTopLeft { CGRect frame = [self originalFrame]; return [self newPointInView:frame.origin]; } -(CGPoint)newTopRight { CGRect frame = [self originalFrame]; CGPoint point = frame.origin; point.x += frame.size.width; return [self newPointInView:point]; } -(CGPoint)newBottomLeft { CGRect frame = [self originalFrame]; CGPoint point = frame.origin; point.y += frame.size.height; return [self newPointInView:point]; } -(CGPoint)newBottomRight { CGRect frame = [self originalFrame]; CGPoint point = frame.origin; point.x += frame.size.width; point.y += frame.size.height; return [self newPointInView:point]; }

Swift 4

extension UIView { /// Helper to get pre transform frame var originalFrame: CGRect { let currentTransform = transform transform = .identity let originalFrame = frame transform = currentTransform return originalFrame } /// Helper to get point offset from center func centerOffset(_ point: CGPoint) -> CGPoint { return CGPoint(x: point.x - center.x, y: point.y - center.y) } /// Helper to get point back relative to center func pointRelativeToCenter(_ point: CGPoint) -> CGPoint { return CGPoint(x: point.x + center.x, y: point.y + center.y) } /// Helper to get point relative to transformed coords func newPointInView(_ point: CGPoint) -> CGPoint { // get offset from center let offset = centerOffset(point) // get transformed point let transformedPoint = offset.applying(transform) // make relative to center return pointRelativeToCenter(transformedPoint) } var newTopLeft: CGPoint { return newPointInView(originalFrame.origin) } var newTopRight: CGPoint { var point = originalFrame.origin point.x += originalFrame.width return newPointInView(point) } var newBottomLeft: CGPoint { var point = originalFrame.origin point.y += originalFrame.height return newPointInView(point) } var newBottomRight: CGPoint { var point = originalFrame.origin point.x += originalFrame.width point.y += originalFrame.height return newPointInView(point) } }

更多推荐

应用UIView变换后查找帧坐标(CGAffineTransform)

本文发布于:2023-11-12 01:12:09,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1580086.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:坐标   UIView   CGAffineTransform

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!