The Core iOS CookBook 1장 학습 노트 - 제스처 및 터치

5301 단어 iostouchgesture
제스처 및 터치 기반 지식
터치 제어는 iOS 시스템 상호작용의 핵심 방식이다.

터치 컨트롤


코코아 터치는 가능한 한 간단한 방식으로 직접적인 조종을 실현했다.터치 이벤트를 상호작용 중인 보기에 보냅니다.
터치할 때마다 터치가 발생하는 위치, 화면을 클릭한 횟수, 터치가 발생하는 시간 등 많은 정보를 전달한다.
iOS는 responder chain (스피커 체인) 을 사용하여 터치 제어에 응답해야 하는 대상이 누구인지 확인합니다.응답자 (responders) 는 응답 이벤트 (이벤트) 의 대상입니다.이 응답자들이 맡은 역할은 일련의 관리자가 이 사건(event)을 관리하는 것과 같다.사용자가 화면을 터치할 때, 프로그램은 터치 이벤트를 처리할 대상을 찾을 것이다.터치 (touch) 는 한 보기에서 다른 보기로 전달되며, 일부 대상이 이 사건 (이벤트) 에 응답할 때까지 전달됩니다.
대부분의 경우 터치(touches)와 그 정보는 UITOuch 대상에 저장되고 터치(touches)는 한 그룹 한 그룹의 형식으로 UIEvent 대상에 전달된다.모든 UIEvent 객체는 단일 터치 이벤트를 나타내며 한 번 또는 여러 번의 터치를 포함합니다.이 점은 개발자가 사용자의 조작에 어떻게 응답하는지를 결정할 뿐만 아니라 사용자가 화면에서 어떻게 조작하는지도 결정한다.
당신의 응용 프로그램은 보기나 보기 컨트롤러를 통해 터치 (touches) 를 수신합니다.터치(touch) 처리를 실현하는 클래스는 UIResponder 클래스를 계승하여 실현해야 한다.터치(touches)를 어디서 처리하고 응답할지 결정할 것입니다.responder 클래스를 사용하지 않고 간단한 제스처 제어를 시도하는 개발 신인들은 많은 어려움을 겪을 것이다.
보기에서 터치(touches)를 처리하는 것은 직감에 어긋나는 것 같다.인터페이스에 표시되는 방식과 터치즈에 대한 응답 방식을 분리하고 싶을 수도 있습니다.더욱이 보기가 터치 제어에 직접 응답하여 상호작용을 실현하는 것은 MVC 디자인 모델에 어긋나는 것 같지만 이렇게 하는 것은 매우 필요할 뿐만 아니라 봉인성을 높일 수 있다.

단계.


터치스는 생명 주기를 가지고 있다.어떤 터치든지 다섯 단계를 겪는다.
  • UItouchPhaseBegan - 사용자가 화면에 처음 닿았을 때
  • UItouchPhaseMoved - 이 접촉 동작이 화면에서 이동할 때
  • UItouchPhaseStationary - 접촉 동작이 화면에서 멈출 때
  • UItouchPhaseEnded - 사용자의 손가락이 화면에서 이동할 때
  • UItouchPhaseCancelled - iOS 시스템이 터치 추적을 중지할 때.시스템이 중단되거나 보기가 창에서 제거되거나 비활성 상태에서 발생합니다.

  • 이 다섯 단계는 터치 이벤트 발생 과정의 전체 절차를 구분하는 데 쓰인다.

    터치 및 응답 방법


    UIView와 UIView Controller를 포함한 모든 UIresponder 클래스의 하위 클래스는 터치에 응답합니다.모든 종류는 자신이 응답할지, 어떻게 응답할지 결정한다.응답이 필요할 때, 이러한 종류의 실례는 사용자의 터치 제어에 대해 자신의 방식으로 응답할 것이다.
    미리 정의된 리셋 방법은 터치 시작, 터치 이동, 터치 끝을 처리할 수 있다.단계(Phase)에 해당합니다.방법은 다음과 같습니다.
  • touchesBegan: with Event: - 터치 제어가 막 발생했을 때 호출됨
  • touchesMoved: with Event: - 터치 제어 이동할 때 호출됨
  • touchesEnded: with Event: - 터치 제어가 끝날 때 호출됨
  • touchesCancelled: with Event: - 시스템이 터치 이벤트를 강제로 중단할 때 이 방법은 호출된다(예를 들어 웨이보를 하고 있는데 갑자기 전화가 왔다. 이 방법은 바로 지금 호출된다)
  • 위의 모든 방법은 UIresponder 방법에 속하며, 보통 UIView나 UIViewController의 하위 클래스에서 이루어진다.이런 방법들은 내부에서 결코 어떤 기능을 실현하지 못했다.터치 동작을 응용 프로그램에 추가하고 싶을 때, 이 방법들을 다시 불러와 자신이 필요로 하는 기능을 실현해야 한다.참고: UITOuchPhaseStationary 단계에서는 콜백되는 방법이 없습니다.

    터치된 뷰


    멀티 터치


    제스처 식별기


    제스처 식별기 종류를 통해 사용자가 가볍게 치기, 축소, 회전, 휩쓸기, 드래그, 또는 긴 누르는 동작을 할 때 우리는 리셋 방법을 터치할 수 있다.
    몇 가지 흔한 제스처Taps - 번트, 1손가락 또는 2손가락스윙스 - 싹쓸이 3.Pinches - 축소 4.Rotations - 두 손가락으로 뷰 회전 5.Pans - 끌어서 변환 6.Long presses - 길게 누르기

    방법1: 직접 조작하는 인터페이스 추가


    직접 조종을 처리할 때, 디자인 센터는 UIView Controller에서 UIView로 이동합니다.더 정확히 말하면 UIresponder로 옮긴 것 같다.UIResponder 클래스에서 얻을 수 있는 방법을 사용자 정의해서 터치할 수 있는 인터페이스를 만듭니다.
    방법1-1 이 예는 DragView라는 UIImageView 클래스의 하위 클래스를 만들고 터치 응답을 이 하위 클래스에 추가합니다.이것은 그림 보기이기 때문에 사용자와 상호작용을 할 수 있는 것이 특히 중요하다. (즉 setUserInteractionEnabled 속성은 YES로 설정되어야 한다.)이 속성은 이 보기 자체와 모든 하위 보기에 영향을 줄 것이다.코드는 다음과 같습니다.
        @implementation DragView
        {
            CGPoint startLocation;
        }
    
        //  
        - (id)initWithImage:(UIImage *)image {
    
            self = [super initWithImage:image];
            if (self) {
    
                //  ,  DragView  
                self.userInteractionEnabled = YES;
            }
    
            return self;
        }
    
        // Responder  
        - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
            //  ,  
            startLocation = [[touches anyObject] locationInView:self];
            [self.superview bringSubviewToFront:self];
        }
    
        // Responder  
        - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    
            //  
            CGPoint point = [[touches anyObject] locationInView:self];
            float dx = point.x - startLocation.x;
            float dy = point.y - startLocation.y;
    
            //  
            CGPoint newCenter = CGPointMake(self.center.x + dx, self.center.y + dy);
    
            //  
            self.center = newCenter;
        }

    방법2: 제스처 식별기를 이용하여 보기의 제스처 제어를 실현한다


    지식 준비
  • Affine Transform 모방 변환 - 일련의 원자 변환의 복합을 통해 실현할 수 있다. 이는 평이(Translation), 축소(Scale), 회전(Flip), 회전(Rotation)과 오절(Shear)을 포함한다.
  • iOS 뷰의 프레임과 bounds 속성의 차이점:http://blog.csdn.net/mad1989/article/details/8711697

  • frame: 이view는 부모view 좌표 시스템의 위치와 크기입니다.(참조점은 아버지의 좌표 시스템)bounds: 이view는 로컬 좌표 시스템의 위치와 크기입니다.(참조점은 로컬 좌표 시스템으로 ViewB 자체의 좌표 시스템에 해당하며 0, 0점을 기점으로 한다)center: 이view의 중심점은 부모view 좌표 시스템의 위치와 크기입니다.(참조점은 아버지의 좌표계)
    -(CGRect)frame{
        return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);
    }
    -(CGRect)bounds{
        return CGRectMake(0,0,self.frame.size.width,self.frame.size.height);
    }

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               Jan 4, 2015

    좋은 웹페이지 즐겨찾기