터치 이벤트와 Xamarin.iOS에서 제스처Touch Events and Gestures in Xamarin.iOS

반드시 터치 이벤트를 이해 하 고 iOS 응용 프로그램의 Api를 터치 장치를 사용 하 여 모든 물리적 상호 작용의 중심으로 합니다.It is important to understand the touch events and touch APIs in an iOS application, as they are central to all physical interactions with the device. 포함 하는 모든 터치 상호 작용을 UITouch 개체입니다.All touch interactions involve a UITouch object. 이 문서에서 사용 하는 방법을 배웁니다는 UITouch 클래스 및 해당 Api에 터치를 지원 합니다.In this article we will learn how to use the UITouch class and its APIs to support touch. 나중에 제스처를 지원 하는 방법에 대 한 지식을 확장 될 예정입니다.Later, we will expand on our knowledge to learn how to support gestures.

터치를 사용 하도록 설정Enabling Touch

컨트롤 UIKit – 해당 서브클래싱된 UIControl에서 – 제스처 UIKit에 기본 제공 된 사용자 상호 작용에 따라서 종속 되며 되지 않으므로 해당 터치를 사용 하도록 설정 해야 합니다.Controls in UIKit – those subclassed from UIControl – are so dependant on user interaction that they have gestures built in to UIKit and therefore it is not necessary to enable Touch. 이미 활성화 됩니다.It is already enabled.

그러나의 보기 중 많은 UIKit 터치 기본적으로 사용할 수 없습니다.However, many of the views in UIKit do not have touch enabled by default. 두 가지 방법으로 터치 컨트롤에 사용할 수 있도록 합니다.There are two ways to enable touch on a control. 첫 번째 방법은 다음과 같습니다. iOS 디자이너의 속성 패드에서 사용자 상호 작용 사용 확인란을 확인 하려면 다음 스크린샷에 표시 된 것 처럼The first way is to check the User Interaction Enabled checkbox in the Property Pad of the iOS Designer, as shown in the following screenshot:

또한 컨트롤러 설정에 사용할 수는 UserInteractionEnabled 속성에서 true로는 UIView 클래스입니다.We can also use a controller to set the UserInteractionEnabled property to true on a UIView class. 코드에서 UI를 만들 경우 이것이 필요 합니다.This is required if the UI is created in code.

다음 코드 줄은 예:The following line of code is an example:

imgTouchMe.UserInteractionEnabled = true;

터치 이벤트Touch Events

터치 사용자 화면을 터치가 손가락을 이동 또는 해당 손가락을 제거 하는 경우 발생 하는 세 가지 단계가 있습니다.There are three phases of touch that occur when the user touches the screen, moves their finger, or removes their finger. 에 정의 된 이러한 메서드가 UIResponder,이 UIView에 대 한 기본 클래스입니다.These methods are defined in UIResponder, which is the base class for UIView. iOS에서 연결된 된 메서드를 재정의 합니다는 UIView 하며 UIViewController 터치를 처리 하려면:iOS will override the associated methods on the UIView and the UIViewController to handle touch:

  • TouchesBegan –이 화면 처음 연결 하는 경우 호출 됩니다.TouchesBegan – This is called when the screen is first touched.
  • TouchesMoved –이 위치가 터치 변경 될 사용자가 손가락을 화면 상대 (sliding) 하는 경우 호출 됩니다.TouchesMoved – This is called when the location of the touch changes as the user is sliding their fingers around the screen.
  • TouchesEnded 또는 TouchesCancelledTouchesEnded 화면에 사용자의 손가락 리프팅되며 때 호출 됩니다.TouchesEnded or TouchesCancelledTouchesEnded is called when the user’s fingers are lifted off the screen. TouchesCancelled 사용자가 자신의 손가락을 키를 눌러 취소 단추에서 슬라이드 하는 경우 iOS가 터치 – 예를 들어, 취소를 호출 됩니다.TouchesCancelled gets called if iOS cancels the touch – for example, if a user slides his or her finger away from a button to cancel a press.

View 개체의 범위 내 터치 이벤트 인지 확인 하려면 UIViews 스택을 통해 이벤트 여행 재귀적으로 터치 합니다.Touch events travel recursively down through the stack of UIViews, to check if the touch event is within the bounds of a view object. 이 종종 이라고 _적중 테스트_합니다.This is often called Hit-testing. 먼저 최상위에서 호출 됩니다 UIView 또는 UIViewController 다음에서 호출 되는 및를 UIViewUIViewControllers 아래 뷰 계층 구조에서 해당 합니다.They will first be called on the topmost UIView or UIViewController and then will be called on the UIView and UIViewControllers below them in the view hierarchy.

UITouch 개체는 사용자가 화면을 터치 할 때마다 생성 됩니다.A UITouch object will be created each time the user touches the screen. UITouch 터치 발생 했을 때 발생 한 위치, 터치 등 안쪽으로 살짝 밀어 되었으면 같은 터치에 대 한 데이터를 포함 하는 개체입니다. 터치 이벤트는 터치 속성 – 전달 되는 NSSet 하나 이상의 터치를 포함 합니다.The UITouch object includes data about the touch, such as when the touch occurred, where it occurred, if the touch was a swipe, etc. The touch events get passed a touches property – an NSSet containing one or more touches. 터치에 대 한 참조를 얻으려면이 속성을 사용 하 고 응용 프로그램의 응답을 확인할 수 있습니다.We can use this property to obtain a reference to a touch, and determine the application’s response.

터치 이벤트 중 하나를 재정의 하는 클래스는 기본 구현을 먼저 가져온 후의 UITouch 이벤트와 연결 된 개체입니다.Classes that override one of the touch events should first call the base implementation and then get the UITouch object associated with the event. 첫 번째 터치에 대 한 참조를 가져오려면 호출 합니다 AnyObject 속성으로 캐스팅을 UITouch 다음 예와에서 같이:To obtain a reference to the first touch, call the AnyObject property and cast it as a UITouch as show in the following example:

public override void TouchesBegan (NSSet touches, UIEvent evt)
{
    base.TouchesBegan (touches, evt);
    UITouch touch = touches.AnyObject as UITouch;
    if (touch != null)
    {
        //code here to handle touch
    }
}

iOS 연속 빠른 화면의 터치 및 단일에서 한 번 탭으로 모두 수집 됩니다 자동으로 인식 UITouch 개체입니다.iOS automatically recognizes successive quick touches on the screen and will collect them all as one tap in a single UITouch object. 이렇게 하면 확인 하는 것 만큼 쉽습니다를 두 번 탭에 대 한 검사는 TapCount 속성을 다음 코드 에서처럼:This makes checking for a double tap as easy as checking the TapCount property, as illustrated in the following code:

public override void TouchesBegan (NSSet touches, UIEvent evt)
{
    base.TouchesBegan (touches, evt);
    UITouch touch = touches.AnyObject as UITouch;
    if (touch != null)
    {
        if (touch.TapCount == 2)
        {
            // do something with the double touch.
        }
    }
}

멀티 터치Multi-Touch

멀티 터치 컨트롤에서 기본적으로 사용 되지 않습니다.Multi-touch is not enabled by default on controls. 다음 스크린샷에 표시 된 것 처럼 iOS 디자이너에서에서 멀티 터치를 활성화할 수 있습니다.Multi-touch can be enabled in the iOS Designer, as illustrated by the following screenshot:

멀티 터치를 설정 하 여 프로그래밍 방식으로 설정할 수 이기도 합니다 MultipleTouchEnabled 코드의 다음 줄에 표시 된 것 처럼 속성:It is also possible to set multi-touch programmatically by setting the MultipleTouchEnabled property as shown in the following line of code:

imgTouchMe.MultipleTouchEnabled = true;

얼마나 많은 손가락 터치 화면을 확인 하려면 사용 합니다 Count 속성에는 UITouch 속성:To determine how many fingers touched the screen, use the Count property on the UITouch property:

public override void TouchesBegan (NSSet touches, UIEvent evt)
{
    base.TouchesBegan (touches, evt);
    lblNumberOfFingers.Text = "Number of fingers: " + touches.Count.ToString();
}

터치 위치를 결정합니다.Determining Touch Location

메서드가 UITouch.LocationInView 지정 된 뷰 내에서 터치의 좌표를 포함 하는 CGPoint 개체를 반환 합니다.The method UITouch.LocationInView returns a CGPoint object that holds the coordinates of the touch within a given view. 또한 메서드를 호출 하 여 컨트롤 내에서 해당 위치를 테스트할 수 있습니다 Frame.Contains합니다.Additionally, we can test to see if that location is within a control by calling the method Frame.Contains. 다음 코드 조각은이 예를 보여 줍니다.The following code snippet shows an example of this:

if (this.imgTouchMe.Frame.Contains (touch.LocationInView (this.View)))
{
    // the touch event happened inside the UIView imgTouchMe.
}

IOS에서 터치 이벤트의 이해를 만들었으므로 이제 해당 제스처 인식기에 대해 알아보겠습니다.Now that we have an understanding of the touch events in iOS, let’s learn about gesture recognizers.

제스처 인식기Gesture Recognizers

제스처 인식기 크게 단순화 하 고 응용 프로그램에서 터치를 지원 하기 위해 프로그래밍 노력을 줄일 수 있습니다.Gesture recognizers can greatly simplify and reduce the programming effort to support touch in an application. iOS 제스처 인식기를 단일 터치 이벤트로는 일련의 터치 이벤트를 집계합니다.iOS gesture recognizers aggregate a series of touch events into a single touch event.

클래스를 제공 하는 Xamarin.iOS UIGestureRecognizer 다음 기본 제공 제스처 인식기에 대 한 기본 클래스로:Xamarin.iOS provides the class UIGestureRecognizer as a base class for the following built-in gesture recognizers:

  • UITapGestureRecognizer – 하나 이상의 탭입니다.UITapGestureRecognizer – This is for one or more taps.
  • UIPinchGestureRecognizer – Pinching 및 떨어진 손가락을 분산 합니다.UIPinchGestureRecognizer – Pinching and spreading apart fingers.
  • UIPanGestureRecognizer – 패닝 또는 끌기.UIPanGestureRecognizer – Panning or dragging.
  • UISwipeGestureRecognizer – 살짝 점에서 모든 방향입니다.UISwipeGestureRecognizer – Swiping in any direction.
  • UIRotationGestureRecognizer – 시계 방향 또는 시계 반대 방향으로 진행으로 돌려 두 손가락을 회전 합니다.UIRotationGestureRecognizer – Rotating two fingers in a clockwise or counter-clockwise motion.
  • UILongPressGestureRecognizer – 키를 누른를 눌러 긴 또는 장기 원클릭 라고도 합니다.UILongPressGestureRecognizer – Press and hold, sometimes referred to as a long-press or long-click.

제스처 인식기를 사용 하 여 기본 패턴은 다음과 같습니다.The basic pattern to using a gesture recognizer is as follows:

  1. 제스처 인식기를 인스턴스화하고 – 먼저 인스턴스화하는 UIGestureRecognizer 하위 클래스입니다.Instantiate the gesture recognizer – First, instantiate a UIGestureRecognizer subclass. 인스턴스화된 개체를 보기에 의해 연결 될 하 고 보기의 삭제 될 때 수집 가비지 됩니다.The object that is instantiated will be associated by a view and will be garbage collected when the view is disposed of. 클래스 수준 변수를이 뷰를 만드는 데 필요한 것입니다.It is not necessary to create this view as a class level variable.
  2. 모든 제스처 설정을 구성 – 제스처 인식기를 구성 하는 다음 단계입니다.Configure any gesture settings – The next step is to configure the gesture recognizer. Xamarin의 설명서를 참조 하세요 UIGestureRecognizer 와의 동작을 제어를 설정할 수 있는 속성의 목록을 하위 클래스를 UIGestureRecognizer 인스턴스.Consult Xamarin’s documentation on UIGestureRecognizer and its subclasses for a list of properties that can be set to control the behavior of a UIGestureRecognizer instance.
  3. 대상 구성 – 해당 Objective-c 특성으로 인해 Xamarin.iOS 제스처 인식기가 제스처와 일치 하는 경우 이벤트를 발생 하지 않습니다.Configure the target – Because of its Objective-C heritage, Xamarin.iOS doesn’t raise events when a gesture recognizer matches a gesture. UIGestureRecognizer 메서드가 – AddTarget – 익명 대리자 또는 코드를 사용 하 여 Objective-c 선택기를 제스처 인식기에서 일치 하는 경우 실행을 허용할 수입니다.UIGestureRecognizer has a method – AddTarget – that can accept an anonymous delegate or an Objective-C selector with the code to execute when the gesture recognizer makes a match.
  4. 제스처 인식기를 사용 하도록 설정 터치 이벤트를 사용 하 여 제스처만 인식 되는 터치 상호 작용을 사용 하는 경우와 마찬가지로 – 합니다.Enable gesture recognizer – Just like with touch events, gestures are only recognized if touch interactions are enabled.
  5. 제스처 인식기 뷰에 추가 – 제스처를 호출 하 여 보기에 추가 하는 최종 단계입니다 View.AddGestureRecognizer , 제스처 인식기 개체를 전달 합니다.Add the gesture recognizer to the view – The final step is to add the gesture to a view by calling View.AddGestureRecognizer , and passing it a gesture recognizer object.

참조 된 제스처 인식기 샘플 코드에서 구현 하는 방법에 대 한 자세한 내용은 합니다.Refer to the gesture recognizer samples for more information on how to implement them in code.

제스처의 대상 호출 될 때 발생 하는 제스처에 대 한 참조가 전달 됩니다.When the gesture’s target is called, it will be passed a reference to the gesture that occurred. 이 제스처 대상을 제스처 발생에 대 한 정보를 얻을 수 있습니다.This allows the gesture target to obtain information about the gesture that occurred. 사용할 수 있는 정보의 범위 사용 된 제스처 인식기의 유형에 따라 달라 집니다.The extent of information available depends on the type of gesture recognizer that was used. 각각에 대해 사용 가능한 데이터에 대 한 자세한 내용은 Xamarin 설명서를 참조 하십시오 UIGestureRecognizer 하위 클래스입니다.Please see Xamarin’s documentation for information about the data available for each UIGestureRecognizer subclass.

제스처 인식기가 뷰에 추가 되 면 뷰 (및 그 아래의 모든 뷰)는 이벤트를 수신 하지 터치를 기억 하는 것이 반드시 합니다.It’s important to remember that once a gesture recognizer has been added to a view, the view (and any views below it) will not receive any touch events. 제스처와 동시에 터치 이벤트를 허용 하는 CancelsTouchesInView 다음 코드에 나온 것 처럼 속성을 false로 설정 해야 합니다.To allow touch events simultaneously with gestures, the CancelsTouchesInView property must be set to false, as illustrated by the following code:

_tapGesture.Recognizer.CancelsTouchesInView = false;

UIGestureRecognizer 제스처 인식기의 상태에 대 한 중요 한 정보를 제공 하는 상태 속성이 있습니다.Each UIGestureRecognizer has a State property that provides important information about the status of the gesture recognizer. 이 속성의 값이 변경 될 때마다 iOS 업데이트를 제공 하는 구독 메서드를 호출 합니다.Every time the value of this property changes, iOS will call the subscribing method giving it an update. 사용자 지정 제스처 인식기 상태 속성을 업데이트 하지, 하는 경우 구독자가 호출 되지 제스처 인식기를 쓸모 없게 렌더링 합니다.If a custom gesture recognizer never updates the State property, the subscriber is never called, rendering the gesture recognizer useless.

제스처는 다음과 같은 두 가지 유형 중 하나로 요약할 수 있습니다.Gestures can be summarized as one of two types:

  1. 불연속 -인식 되는 이러한 제스처만 첫 번째 실행 시간입니다.Discrete – These gestures only fire the first time they are recognized.
  2. 연속 – 이러한 제스처 인식 되는으로 실행을 계속 합니다.Continuous – These gestures continue to fire as long as they are recognized.

제스처 인식기 상태는 다음 중 하나에 있습니다.Gesture recognizers exists in one of the following states:

  • 가능한 – 모든 제스처 인식기의 초기 상태입니다.Possible – This is the initial state of all gesture recognizers. 이것이 기본값 State 속성입니다.This is the default value the State property.
  • 시작 – 연속 제스처는 먼저 인식 하는 경우 상태는 시작으로 설정 됩니다.Began – When a continuous gesture is first recognized, the state is set to Began. 이렇게 하면 제스처 인식 시작 될 때 변경 되 면 사이의 구분을 구독할 수 있습니다.This allows subscribes to differentiate between when gesture recognition starts and when it is changed.
  • Changed – 연속 제스처 조치가 시작 되었지만 완료 되지 않았습니다, 후 상태에 설정할 Changed 터치 이동 되거나 변경 될 때마다 제스처의 예상된 매개 변수 내에서 여전히 것으로 합니다.Changed – After a continuous gesture has begun, but hasn’t finished, the state will be set to Changed every time a touch moves or changes, as long as it’s still within the expected parameters of the gesture.
  • 취소 – 인식기 전환 시작에서 변경 및 다음 이러한 방식으로 변경에 더 이상 터치 제스처의 패턴에 맞지 하는 경우이 상태로 설정 됩니다.Cancelled – This state will be set if the recognizer went from Began to Changed, and then the touches changed in such a way as to no longer fit the pattern of the gesture.
  • 인식 – 제스처 인식기 터치 집합과 일치 하 고 알려줍니다 구독자 제스처가 완료 되었음을 나타내는 상태 설정 됩니다.Recognized – The state will be set when the gesture recognizer matches a set of touches and will inform the subscriber that the gesture has finished.
  • 종료 -인식 상태에 대 한 별칭입니다.Ended – This is an alias for the Recognized state.
  • 실패 한 – 제스처 인식기는 더 이상 상태는 실패로 변경에 대 한 수신 하 고 터치를 일치 시킬 수 없습니다.Failed – When the gesture recognizer can no longer match the touches it is listening for, the state will changed to Failed.

Xamarin.iOS에서 이러한 값을 나타내는 UIGestureRecognizerState 열거형입니다.Xamarin.iOS represents these values in the UIGestureRecognizerState enumeration.

여러 제스처 작업Working with Multiple Gestures

기본적으로 iOS에서는 기본 제스처 동시에 실행할 수 없습니다.By default, iOS does not allow default gestures to run simultaneously. 대신, 각 제스처 인식기 비 결정적인 순서에서 터치 이벤트를 받게 됩니다.Instead, each gesture recognizer will receive touch events in a non-deterministic order. 다음 코드 조각은 동시에 실행 하는 제스처 인식기를 확인 하는 방법을 보여 줍니다.The following code snippet illustrated how to make a gesture recognizer run simultaneously:

gesture.ShouldRecognizeSimultaneously += (UIGestureRecognizer r) => { return true; };

IOS에서 제스처를 사용 하지 않도록 설정할 이기도 합니다.It is also possible to disable a gesture in iOS. 두 가지 대리자 속성을 제스처 인식기는 방법에 대 한 의사 결정 및 제스처를 인식 해야 하는 경우에 현재 터치 이벤트와 응용 프로그램의 상태를 검사할 수 있도록 합니다.There are two delegate properties that allow a gesture recognizer to examine the state of an application and the current touch events, to make decisions on how and if a gesture should be recognized. 두 이벤트 다음과 같습니다.The two events are:

  1. ShouldReceiveTouch – 터치 이벤트를 전달 하 고 터치를 검토 하 고는 터치 제스처 인식기에서 처리 되는 결정 기회를 제공 하는 제스처 인식기 직전이 대리자가 호출 됩니다.ShouldReceiveTouch – This delegate is called right before the gesture recognizer is passed a touch event, and provides an opportunity to examine the touches and decide which touches will be handled by the gesture recognizer.
  2. ShouldBegin –이 인식기를 다른 상태에서 가능한 상태를 변경 하려고 하는 때 호출 됩니다.ShouldBegin – This is called when a recognizer attempts to change state from Possible to some other state. False를 반환 실패 하도록 변경 제스처 인식기의 상태를 강제로 됩니다.Returning false will force the state of the gesture recognizer to be changed to Failed.

강력한 형식의 이러한 메서드를 재정의할 수 있습니다 UIGestureRecognizerDelegate, 약한 대리자 또는 다음 코드 조각에 표시 된 것과 같이 이벤트 처리기 구문을 통해 바인딩:You can override these methods with a strongly typed UIGestureRecognizerDelegate, a weak delegate, or bind via the event handler syntax, as illustrated by the following code snippet:

gesture.ShouldReceiveTouch += (UIGestureRecognizer r, UITouch t) => { return true; };

마지막으로 제스처 인식기 실패 하면 다른 제스처 인식기만 성공할 수 있도록 큐에 대기 하는 것이 같습니다.Finally, it is possible to queue up a gesture recognizer so that it will only succeed if another gesture recognizer fails. 예를 들어, 단일 탭 제스처 인식기를 두 번 탭 제스처 인식기를 실패 한 경우에 성공 해야 합니다.For example, a single tap gesture recognizer should only succeed when a double tap gesture recognizer fails. 다음 코드 조각은이 예제를 제공 합니다.The following code snippet provides an example of this:

singleTapGesture.RequireGestureRecognizerToFail(doubleTapGesture);

사용자 지정 제스처 만들기Creating a Custom Gesture

IOS는 몇 가지 기본 제스처 인식기를 제공 하지만 특정 한 경우에 사용자 지정 제스처 인식기를 만들어야 할 수 있습니다.Although iOS provides some default gesture recognizers, it may be necessary to create custom gesture recognizers in certain cases. 사용자 지정 제스처 인식기를 만드는 단계는 다음과 같습니다.Creating a custom gesture recognizer involves the following steps:

  1. 서브 클래스 UIGestureRecognizer 합니다.Subclass UIGestureRecognizer .
  2. 적절 한 터치 이벤트 메서드를 재정의 합니다.Override the appropriate touch event methods.
  3. 기본 클래스의 상태 속성을 통해 인식 상태 위로 버블링 됩니다.Bubble up recognition status via the base class’ State property.

이 실용적인 예제에서 설명 합니다 iOS의 터치를 사용 하 여 연습 합니다.A practical example of this will be covered in the Using Touch in iOS walkthrough.