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

标签 iphone ios objective-c uiview cgaffinetransform

我使用 CGAffineTransform 旋转 View

[view setTransform:newTransform];

应用变换后帧值保持不变,但如何找到该帧的“旋转”或变换值?


(来源:informit.com)

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

最佳答案

要记住的一件事是变换会改变坐标系,因此您需要能够在父“ View ”和子(变换后的) View 之间进行转换。此外,变换保留变换对象的中心,但不保留任何其他坐标。所以你需要根据中心来计算东西。您将需要几个 helper 。 (我从 Erica Sadun 的《Core iOS Developer's Cookbook》一书中获得了以下大部分方法)。

我通常将它们添加为 UIView 上的一个类别。

为了将 child 的坐标转换为 parent 的坐标,您需要这样的东西:

// 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)
    }
}

关于iphone - 应用 UIView 变换后查找帧坐标 (CGAffineTransform),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19523487/

相关文章:

iphone - 在photoscroller应用程序(iPhone WWDC-104照片应用程序)中,使用presentModalviewController调用时,uiscrollview图像向右移动

iphone - 当 UITableView 嵌套在 UIScrollView 中时,如何触发 scrollsToTop

ios - 取决于互联网连接显示 ViewController iOS

ios - 从连接到未连接的多点连接 session

ios - 有谁能帮我向应用商店提交申请吗?

objective-c - 在 WebView Cocoa 中放大和缩小

objective-c - 在服务器上编辑 Plist

ios - 新项目中的CoreData

iphone - 如何使用特定名称保存 UIImagePicker 图像

iphone - iOS(苹果): Is there any way for the application to ask the OS to block the device in that application?