-1

UIView に回転とスケーリングを適用しています。これらの変換の 1 つを適用すると正常に動作しますが、両方を適用しようとすると、結果はあまりスムーズではありません。リセットすると表示され、適用が開始されます。これが私のコードですここにコードを入力してください

var location:CGPoint = CGPoint.zero
var rotatingLoaction:CGPoint = CGPoint.zero
var deltaAngle: CGFloat!
func handleRotateAndResizeWithPanGestureRecognizer(_ recognizer: UIPanGestureRecognizer) -> Void
{
    location = recognizer.location(in: self.superview)

    let sizeCenter = CGPoint(x: (self.frame.origin.x + self.frame.size.width) / 2.0, y: (self.frame.origin.y + self.frame.size.height) / 2.0)

    if recognizer.state == .began {
        initialDistance = sizeCenter.getDistance(point: location)
        deltaAngle = atan2(location.y - sizeCenter.y, location.x - sizeCenter.x) - self.transform.getAngle()
    }
    else if recognizer.state == .changed
    {
        let ang = atan2(location.y - sizeCenter.y,
                          location.x - sizeCenter.x);
        let angleDiff = deltaAngle - ang;

        self.setNeedsDisplay()
        var t = CGAffineTransform.identity
        let distance = CGFloat(sizeCenter.getDistance(point: location))
        let scale =  distance / initialDistance
        t = t.rotated(by: -angleDiff)
        t = t.scaledBy(x:  CGFloat(scale), y: CGFloat(scale))

        self.transform  =  t

        self.setNeedsDisplay()
         print("\(center )    \(scale)")
    }

}

ここに画像の説明を入力

更新CGPointの拡張機能で記述された私のgetDistanceメソッドは次のとおりです

func getDistance(point: CGPoint) -> CGFloat {
        let fx = (point.x - self.x);
        let fy = (point.y - self.y);

        return sqrt((fx*fx + fy*fy))
    }
4

1 に答える 1