我试图指出一个所谓的' bar'将它旋转到一个“扬声器”上。 见下面的例子:
但是你可以看到upperLeftBar
是唯一真正指向正确的东西。 upperRightBar
和lowerLeftBar
几乎可以,但仍然不太好。正如您所看到的,lowerRightBar
完全丢失了。
如何优化此功能?代码非常简单,我只需使用atan2
并使用DY / DX进行操作,然后将半径转换为度数并让它旋转。请参阅下面的代码段。
public func foo(){
upperLeftBar.rotate(angle: calculateRotatingDegree(view: upperLeftBar, view2: speakerImage))
upperRightBar.rotate(angle: calculateRotatingDegree(view: speakerImage, view2: upperRightBar))
lowerLeftBar.rotate(angle: calculateRotatingDegree(view: lowerLeftBar, view2: speakerImage))
lowerRightBar.rotate(angle: calculateRotatingDegree(view: speakerImage, view2: lowerRightBar))
}
private func calculateRotatingDegree(view:UIView, view2:UIView) -> CGFloat{
let origin2 = view.frame.origin
let origin1 = view2.frame.origin
return atan2(origin1.y - origin2.y, origin1.x - origin2.x).radiansToDegrees
}
extension FloatingPoint {
var radiansToDegrees: Self { return self * 180 / .pi }
}
func rotate(angle: CGFloat) {
let radians = angle / 180.0 * CGFloat(Double.pi)
self.transform = CGAffineTransform.init(rotationAngle: radians)
}