代码之家  ›  专栏  ›  技术社区  ›  Vahid

更改UIView旋转将更改其帧大小。旋转后如何保持框架尺寸?

  •  1
  • Vahid  · 技术社区  · 6 年前

    我在旋转 UIView UIRotationGestureRecognizer 但我有个问题,轮换 UIView公司

    targetView = UIView(frame: CGRect(x: self.view.center.x, y: self.view.center.y , width: 100, height: 100))
    targetView.backgroundColor = .red
    targetView.isUserInteractionEnabled = true
    self.view.addSubview(targetView)
    
    targetView.center = self.view.center
    
    let rotate = UIRotationGestureRecognizer(target: self, action: #selector(rotatedView))
    targetView.addGestureRecognizer(rotate)
    

    以下是旋转函数:

    @objc func rotatedView(_ sender: UIRotationGestureRecognizer) {
    var originalRotation = CGFloat()
    if sender.state == .began {
        sender.rotation = lastRotation 
        originalRotation = sender.rotation
    
        print("TargetView Frame Size: [START ROTATE] ", self.targetView.frame.size)
        print("TargetView Bounse Size: [START ROTATE] ", self.targetView.bounds)
    
    } else if sender.state == .changed {
        let newRotation = sender.rotation + originalRotation
        sender.view?.transform = CGAffineTransform(rotationAngle: newRotation)
    
        print("TargetView Frame Size: [ROTATETING] ", self.targetView.frame.size)
        print("TargetView Bounse Size: [ROTATING ROTATE] ", self.targetView.bounds)
        }
    }
    

    大小将更改:

    TargetView Frame Size: [START ROTATE]  (100.0, 100.0)
    TargetView Frame Size: [ROTATETING]  (110.564206726133, 110.564206726133)
    

    如何在旋转后保持帧大小就像开始旋转一样?!

    我有这些手势:旋转,调整大小,移动。

    移动效果很好,但是旋转改变了大小。我可以在这里使用边界,但如果我也调整了大小,边界就不再有用了。

    1 回复  |  直到 6 年前
        1
  •  2
  •   vacawama    6 年前

    您需要缩放但不旋转的视图大小。你可以从 bounds.size transform .

    例子

    let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 150))
    
    // Scale view by 3X horizontally and by 4X vertically and
    // rotate by 45 degrees
    view.transform = CGAffineTransform(scaleX: 3, y: 4).rotated(by: 45.0 / 180.0 * .pi)
    
    let transform = view.transform
    
    // Find the angle, print it in degrees
    let angle = atan2(-transform.c, transform.a)
    print(angle * 180.0 / .pi) // 44.99999999999999
    
    // Find scaleX and scaleY
    let scaleX = transform.a * cos(angle) - transform.c * sin(angle)
    let scaleY = transform.d * cos(angle) + transform.b * sin(angle)
    print(scaleX) // 3.0
    print(scaleY) // 4.0
    
    print(view.frame.size)  // (530.3300858899106, 707.1067811865476)
    print(view.bounds.size) // (100.0, 150.0)
    
    let adjustedSize = CGSize(width: view.bounds.size.width * scaleX, height: view.bounds.size.height * scaleY)
    
    // print non-rotated but scaled size
    print(adjustedSize) // (300.0, 600.0)
    

    在这里,它是一个方便的扩展,可用于缩放、旋转和转换(移动)视图:

    extension CGAffineTransform {
        var angle: CGFloat { return atan2(-self.c, self.a) }
    
        var angleInDegrees: CGFloat { return self.angle * 180 / .pi }
    
        var scaleX: CGFloat {
            let angle = self.angle
            return self.a * cos(angle) - self.c * sin(angle)
        }
    
        var scaleY: CGFloat {
            let angle = self.angle
            return self.d * cos(angle) + self.b * sin(angle)
        }
    }
    

    let angle = view.transform.angleInDegrees
    let scaleX = view.transform.scaleX
    let scaleY = view.transform.scaleY
    let adjustedSize = CGSize(width: view.bounds.size.width * scaleX, height: view.bounds.size.height * scaleY)