将视图从其原点旋转到另一个视图

时间:2018-08-23 10:43:05

标签: ios swift rotation transform

我正在尝试将视图旋转到另一个视图的中心点(记住不要绕着它的方向)。

假设我有2个这样放置的视图

enter image description here

现在我要旋转俯视图,以这样指向底视图

enter image description here

这就是我所做的

  • 将顶视图锚点更改为其原点。使其可以旋转并将其边缘指向底视图
  • 计算了第一个视图原点和底部视图中心之间的角度
  • 并将计算出的变换应用于顶视图。

    在我正在使用的代码下面

    myd$samp = sapply(as.character(myd$samp), function(x){
      ifelse(nchar(x) > 15,
             paste0(substr(x,1,15),"\n",substr(x,16,nchar(x))),
             x)
    })
    

我正在使用Get angle from 2 positions中的扩展名来计算2个点之间的角度

let rect = CGRect(x: 70, y: 200, width: 300, height: 100)
let rectView = UIView(frame: rect)
rectView.layer.borderColor = UIColor.green.cgColor;
rectView.layer.borderWidth = 2;

let endView = UIView(frame: CGRect(x: 250, y: 450, width: 70, height: 70))
endView.layer.borderColor = UIColor.green.cgColor;
endView.layer.borderWidth = 2;
let end = endView.center;

self.view.addSubview(endView)
self.view.addSubview(rectView!)
rectView.setAnchorPoint(CGPoint.zero)

let angle = rectView.bounds.origin.angle(to: end);
UIView.animate(withDuration: 3) {
    rectView.transform = rectView.transform.rotated(by: angle)
}   

但是,此操作未按预期进行,轮换方式逐渐消失。检查以下问题的屏幕截图

enter image description here

我认为这个问题与角度的计算方式有关,但我不知道是什么?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

角度必须为弧度

旋转角度需要以弧度指定:

更改:

rectView.transform = rectView.transform.rotated(by: angle)

收件人:

rectView.transform = rectView.transform.rotated(by: angle / 180.0 * .pi)

或更改您的angle(to:)方法以返回弧度而不是度。


使用frame代替bounds

此外,在计算角度时,您需要使用frame中的rectView。视图的bounds是其内部坐标空间,这意味着其原点始终为(0, 0)。您需要frame,它是视图在其父级坐标系中的坐标。

更改:

let angle = rectView.bounds.origin.angle(to: end)

收件人:

let angle = rectView.frame.origin.angle(to: end)

注意:由于您的anchorPointrectView的一角,因此这会将rectView的上边缘指向endView的中心。解决该问题的一种方法是将anchorPoint更改为rectView左边缘的中心,然后使用该点计算angle