2017-10-09 59 views
0

enter image description here检索在变换X为边缘

欲计算边缘的x位置(左上,右上,左下和右下),其具有目前一个CGAffineTransformation一个UIView的用rotationAngle激活。在图片中,我想计算最右边红圈的x位置。

本文介绍如何在Obj-c中执行此操作,我相信:http://www.informit.com/articles/article.aspx?p=1951182。我试图将其转换为swift 4,但我不得不做出很多更改。我来到这个:

func offsetPoint(toParentCoordinates aPoint: CGPoint) -> CGPoint { 
    return CGPoint(x: aPoint.x + self.cardView.center.x, y: aPoint.y + self.cardView.center.y) 
} 

func point(inViewCenterTerms aPoint: CGPoint) -> CGPoint { 
    return CGPoint(x: aPoint.x - self.cardView.center.x, y: aPoint.y - self.cardView.center.y) 
} 

func point(inTransformedView aPoint: CGPoint, someTransformation: CGAffineTransform) -> CGPoint { 
    let offsetItem: CGPoint = point(inViewCenterTerms: aPoint) 
    let updatedItem: CGPoint = offsetItem.applying(someTransformation) 
    let finalItem: CGPoint = offsetPoint(toParentCoordinates: updatedItem) 
    return finalItem 
} 

func originalFrame(someView: UIView, someTransformation: inout CGAffineTransform) -> CGRect { 
    let currentTransform: CGAffineTransform = someTransformation 
    someTransformation = CGAffineTransform.identity 
    let originalFrame: CGRect = someView.frame 
    someTransformation = currentTransform 
    return originalFrame 
} 

但我被困在其余的。我在想,如果Swift 4中的事情变得更简单,或者如何继续其余的代码来使其工作。

+0

您是否尝试过使用简单的坐标计算:let x = r * sin(angle)并设y = r * cos(angle)? r是半径,在你的情况下,它是对角线的一半长度。 – Woof

回答

1

我需要这个功能对我自己的项目之一,也是,所以我写了一个基于由埃里卡丧盾的对象 - 这个代码UIView扩展你链接到你的问题:

extension UIView { 

    /// Returns the frame without any transformations 
    var originalFrame: CGRect { 

     let currentTransform = self.transform 
     self.transform = CGAffineTransform.identity 
     let frame = self.frame 
     self.transform = currentTransform 

     return frame 
    } 

    /// Returns the offset of the given point from the view center 
    func centerOffset(from point: CGPoint) -> CGPoint { 
     return CGPoint(x: point.x - center.x, y: point.y - center.y) 
    } 

    /// Returns the point relative to the view center by the given offset 
    func pointRelativeToCenter(by offset: CGPoint) -> CGPoint { 
     return CGPoint(x: offset.x + center.x, y: offset.y + center.y) 
    } 

    /// Returns the given point in transformed coordinates 
    func newPointInView(point: CGPoint) -> CGPoint { 

     let offset = self.centerOffset(from: point) 
     let transformedOffset = offset.applying(self.transform) 

     return self.pointRelativeToCenter(by: transformedOffset) 
    } 

    // Helpers to get the new View corner coordinates 

    var newTopLeft: CGPoint { 
     let frame = self.originalFrame 
     return self.newPointInView(point: frame.origin) 
    } 

    var newTopRight: CGPoint { 
     let frame = self.originalFrame 
     var point = frame.origin 
     point.x += frame.size.width 
     return self.newPointInView(point: point) 
    } 

    var newBottomLeft: CGPoint { 
     let frame = self.originalFrame 
     var point = frame.origin 
     point.y += frame.size.height 
     return self.newPointInView(point: point) 
    } 

    var newBottomRight: CGPoint { 
     let frame = self.originalFrame 
     var point = frame.origin 
     point.x += frame.size.width 
     point.y += frame.size.height 
     return self.newPointInView(point: point) 
    } 
} 

现在你可以简单地访问应用了CGAffineTransform的任何UIView上的newTopLeft,newTopRight,newBottomLeftnewBottomRight属性,以便获得变换视图在父空间中的各个角位置。

这里有一个小操场例子来演示如何使用扩展:

import UIKit 
import PlaygroundSupport 

// Setting up some example views 
let containerView = UIView(frame: CGRect(x: 0, y: 0, width: 500, height: 500)) 
containerView.backgroundColor = .white 
PlaygroundPage.current.liveView = containerView 

let transformedView = UIView(frame: CGRect(x: 150, y: 150, width: 200, height: 200)) 
transformedView.backgroundColor = .clear 
transformedView.layer.borderWidth = 3 
transformedView.layer.cornerRadius = 2 
containerView.addSubview(transformedView) 

// Add a rotation 
let angle = CGFloat.pi/4 
transformedView.transform = CGAffineTransform(rotationAngle: -angle) 

print(transformedView.newTopLeft) // assuming you've inserted the extension into the Playground somewhere above this line 

enter image description here

print(transformedView.newTopLeft)然后将输出

(108.57864376269, 250.0) 

你可以使用一些简单的三角函数检查值是正确的。

+0

Thx bro。虽然我有这条线的问题:PlaygroundPage.current.liveView = containerView,我在VC中测试它。有效 :)。由于限制,我可以在几个小时内奖赏赏金。 – NoKey

+0

@JasperVisser哦,对!你需要'导入PlaygroundSupport'来使实时查看工作。我忘了复制那一行。 – Keiwan