2017-03-28 10 views
1

CGAffineTransform을 사용하는 ImageView를 회전하려고합니다. 기본적으로, 내가 원하는 것은 x 좌표가 증가 할 때마다 ImageView를 조금 더 회전 시키길 원한다는 것입니다.CGAffineTransform 및 PanGestureRecognizer를 사용하여 ImageView를 회전하십시오.

저는 수학을했는데 ImageView를 1.6º마다 1 x-coordinate으로 돌리고 싶습니다.

@objc func personDragRecognizer(recognizer: UIPanGestureRecognizer) { 

    let rotationAngle: CGFloat = 1.6 

    let translation = recognizer.translation(in: rView) 
    if let view = recognizer.view { 
     view.center = CGPoint(x:view.center.x + translation.x, y:view.center.y + translation.y) 
     view.transform = CGAffineTransform(rotationAngle: rotationAngle) 
    } 
    recognizer.setTranslation(CGPoint.zero, in: rView) 

    if recognizer.view?.center == CGPoint(x: 197.5, y: 232.5) { 
     PlaygroundPage.current.liveView = eeView 
    } 

이의 문제가 1.6 times 360rotates576º bc에 있다는 것입니다 : 이것은 내가 지금까지 gesture recognizer 기능에있는 것입니다. 그리고 그것은 회전하는 것을 계속하지 않습니다. 나는 계속해서 회전시키고 싶다.

누구든지 도움을받을 수 있다면 대단히 감사하겠습니다. 미리 감사드립니다.

건배, 테오

답변

4

나는 내가 완전히 구현하려는 기능을 이해 있는지 확실하지 않습니다. 다음은 이미지 회전을 담당하는 UIView 하위 클래스의 샘플입니다.

class CustomView: UIView { 
    override init(frame: CGRect) { 
     super.init(frame: frame) 

     let panGR = UIPanGestureRecognizer(target: self, action: #selector(panGestureDetected(sender:))) 
     self.gestureRecognizers = [panGR] 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    var gestureBeginning: CGFloat = 0.0 

    func panGestureDetected(sender: UIPanGestureRecognizer) { 
     guard sender.numberOfTouches > 0 else { return } 

     let touchPoint = sender.location(ofTouch: 0, in: self) 

     switch sender.state { 
     case .began: 
      gestureBeginning = touchPoint.x 
      print("gestureBeginning: \(gestureBeginning)") 
     case .changed: 
      let progress = touchPoint.x - gestureBeginning 
      print("progress: \(progress)") 
      let rotationAngle: CGFloat = 1.6 * progress 
      let view = self.subviews[0] 
      let rads = rotationAngle * .pi/180 
      view.transform = CGAffineTransform(rotationAngle: rads) 
     default: 
      break 
     } 
    } 
} 

은 놀이터에서 실행하려면

let imageView = UIImageView(image: #imageLiteral(resourceName: "image.png")) 
imageView.frame = CGRect(origin: CGPoint(x: 50.0, y: 50.0), size: CGSize(width: 150.0, height: 150.0)) 

let containerView = CustomView(frame: CGRect(origin: .zero, size: CGSize(width: 250.0, height: 250.0))) 
containerView.addSubview(imageView) 

PlaygroundPage.current.liveView = containerView 
PlaygroundPage.current.needsIndefiniteExecution = true