Swift UIView每次都放错位置';s旋转

Swift UIView每次都放错位置';s旋转,swift,uiview,rotation,Swift,Uiview,Rotation,我有一把尺子(红色)和一个UIView(橙色),如下所示: 当我旋转标尺时,UIView也会旋转,但其位置与我预期的不同: 我使用ui长按手势识别器旋转标尺,当我握住手指并移动时,我得到了一个角度来重新绘制标尺,它工作得很好,但不适用于ui视图 如何创建和旋转UIView: func createUIViewOutSideRuler(touchedPoint:CGPoint, notTouchedPoint:CGPoint, angle: CGFloat) -> UIView{

我有一把尺子(红色)和一个UIView(橙色),如下所示:

当我旋转标尺时,UIView也会旋转,但其位置与我预期的不同:

我使用
ui长按手势识别器
旋转标尺,当我握住手指并移动时,我得到了一个
角度
来重新绘制标尺,它工作得很好,但不适用于ui视图

如何创建和旋转UIView:

 func createUIViewOutSideRuler(touchedPoint:CGPoint, notTouchedPoint:CGPoint, angle: CGFloat) -> UIView{
        let viewWidth = distanceFromTwoPoints(touchedPoint, notTouchedPoint)

        let view = UIView(frame: CGRect(x:notTouchedPoint.x, y: notTouchedPoint.y , width:  viewWidth, height: dotLineSize * 2))
        
        view.transform = CGAffineTransform(rotationAngle: angle);

        view.backgroundColor = .orange
        self.addSubview(view)
        return view
    }
根据清扫者评论更新基础

let view = UIView(frame: CGRect(x:notTouchedPoint.x, y: notTouchedPoint.y , width:  viewWidth, height: dotLineSize * 2))
        
let vectorToStartPoint = CGPoint(x: view.center.x - touchedPoint.x,
                                         y: view.center.y - touchedPoint.y )
view.transform = CGAffineTransform(translationX: vectorToStartPoint.x, y: vectorToStartPoint.y)
                             .rotated(by: angle)
                             .translatedBy(x: -vectorToStartPoint.x, y: -vectorToStartPoint.y)
结果:

注意:我拖动
接触点
旋转

以接触点为中心

以非接触点为中心

您需要围绕
notTouchedPoint
旋转视图。默认情况下,使用
CGAffineTransform.init(rotationAngle:)
创建的旋转将围绕视图中心旋转视图

要执行此操作,请首先将视图的中心平移到
起始点
,旋转它,然后再将其向后平移

let vectorToNotTouchedPoint = CGPoint(x: view.center.x - notTouchedPoint.x
                                      y: view.center.y - notTouchedPoint.y)
view.transform = CGAffineTransform(translationX: vectorToNotTouchedPoint.x, y: vectorToNotTouchedPoint.y)
                     .rotated(by: angle)
                     .translatedBy(x: -vectorToNotTouchedPoint.x, y: -vectorToNotTouchedPoint.y)

它不起作用,我根据你的答案用结果图片更新了我的问题,假设
startPoint
notTouchedPoint
@baole为什么你要用
notTouchedPoint
/
touchedPoint
替换
startPoint
?当我说
startPoint
时,我的意思是
startPoint
参数。
startPoint
参数是
touchedPoint
,我只是为了更清晰的上下文而更改了名称。在我更改名称之前,我使用了与你所说的完全相同的
startPoint
参数,结果是最后一张图片。rry,
startPoint
应该是
touchedPoint
@baole-Hmm,看起来不错。。。那我就没有主意了-(让我们等待其他人,看看他们是否能回答:-)