티스토리 뷰

iOS

iOS ) Gesture Recognizer - Rotation

Zedd0202 2017. 12. 15. 00:43
반응형

얼른얼른 다른것도 써봅시다.

이번엔 Rotation!!! 코드는 Pinch와 거의 똑같아요 :)


Gesture Recognizer - Rotation



Rotation  Gesture는 조금?...생소할 수 도 있어요. 저한테는 생소했음

역시나 Handling Rotation Gestures를 참고하도록 할게요. 


이것이 바로 Rotation  Gesture입니다. 감이오시나요?

응 안와~

이것이 『Rotation

Rotation Gesture의 정의는 "화면에서 두 손가락의 상대적인 회전을 측정하고 , 해당 동작을 사용하여 컨텐츠를 회전시킵니다."

Pinch처럼 두손가락을 사용하죠?

Rotation Gesture의 설명을 더 볼게요.


회전동작(rotational movements)을 앱의 input으로 사용하려면, Rotation Gesture Recognizer를 사용하세요. Rotation Gesture는 일반적으로 화면상의 객체를 조작하는 데 사용됩니다. 예를들어, View를 회전하거나, 사용자 정의 컨트롤 값을 업데이트 하는데 사용할 수 있습니다. Rotation Gesture는 연속적이므로, 회전값이 변경될 때마다 액션메소드가 호출되므로 콘텐츠를 업데이트 할 수 있습니다. Gesture Recognizer는 회전값을 라디안 단위로 보고(report)합니다. 사용자의 손가락 사이에 선이 있다고 가정하면, 초기 위치에서 손가락으로인해 생성된 선은 측정을 위한 초기지점을 나타내므로, 회전각도는 0입니다. 

사용자의 손가락이 움직이면, 손가락 사이에 새로운 선이 생깁니다. 각각의 새로운 위치에서  Gesture Recognizer는 초기 선과 각 새 선사이의 각도를 측정하고, 결과값을 rotation 프로퍼티에 배치합니다. Rotation Gesture Recognizer는 회전이 시작되었음 나타내는 방식으로 사용자의 손가락의 위치가 변경되는 즉시, begun state가 됩니다. 초기 변경 후에는 이후의 변경으로 인해 Gesture Recognizer가 changed state로 들어가서 회전각도를 업데이트합니다. 사용자의 손가락이 화면에서 들리면, Gesture Recognizer가 ended상태가 됩니다.

오......Pinch Gesture가 scale factor를 이용했다면, Rotation Gesture은 "각도"를 이용하네요!!!!그리고 Pinch와 마찬가지로 begun, changed, ended state도 있네요.

중요!!!

컨텐츠에 회전값을 적용할 때 주의를 기울여야 합니다. 그렇지 않으면 예기치 않은 결과가 발생할 수 있습니다. Gesture Recognizer에 의해 보고 된 회전은 현재 손가락 위치와 초기 손가락 위치 사이이 각도를 나타냅니다. 새로운 회전값을 컨텐츠에 그대로 적용하면, 새로운값이 이전의 모든 값을 합성(compound)하므로 컨텐츠가 너무 빠르게 회전합니다. 이렇게 하는 대신, 컨텐츠의 원래 값을 캐싱하고 회전을 원래값에 적용할 다음, 새 값을 다시 컨텐츠에 적용합니다. 또는 각 새 변경사항을 적용한 후 회전 계수(rotation factor)를 0.0으로 다시 설정하세요.


역시나 마지막줄이 핵심입니다. Pinch와 다르게 Rotation은 회전 값들이 계속 누적되나 보네요. (Pinch는 계속 곱하는 거였죠?) 그야 당연한게, "초기"의 손가락에 의해 생긴 선과 변경되는 손가락들에 의해 생기는 선의 각도니까요. 계속 누적되게 됩니다.

그러니까!!!! action메소드가 불릴때마다 rotation factor을 0.0으로 초기화해주자는 거죠.

역시나 프로젝트를 만들어주시고, imageView와 Rotation Gesture Recognizer의 IBOutlet을 따주세요.


역시나 IBAction도!



  1.  @IBAction func rotationAction(_ sender: Any) {

            myImageView.transform = myImageView.transform.rotated(by: rotationRecognizer.rotation)

            rotationRecognizer.rotation = 0

        }



rotation을 0으로 만들어주지 않으면 위에서 말했듯이 rotation의 값이 계속 누적됩니다. 




초기 손가락과 현재 손가락에서 생긴 선들의 각도가 계속 증가하는 것이죠. 그걸 imageView의 transform에 넣어주니, imageView가 엄청빠르게 돌아가는 것이죠. 그러니까 rotation 프로퍼티의 값을 계속 0으로 만들어주어야 합니다. 

코드로는 Pinch와 똑같습니다. UIRotationGestureRecognizer를 만들고 selector메소드를 만든 뒤, trasform을 해주면 됩니다 :)


  1.  override func viewDidLoad() {

            super.viewDidLoad()

            let rotationRecogniezer = UIRotationGestureRecognizer(target: self, action: #selector(rotationAction(_ :)))

            myImageView.addGestureRecognizer(rotationRecogniezer)

        }

     @objc func rotationAction(_ sender : UIRotationGestureRecognizer){

            myImageView.transform = myImageView.transform.rotated(by: sender.rotation)

            sender.rotation = 0.0

        }


나는 회전이 안돼!! -> ImageViewisUserInteractionEnabledtrue인지 확인해보세요.

뭔가 Pinch나 Rotation이나 뭔가 수학적으로 이렇게 다 계산이 된다는게...너무 재밌어요zzz

빨리 다음꺼 해야징

반응형