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 클래스UIView 에서 컨트롤러를 사용 하 여 속성을 true로 설정할 수 있습니다.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. 이러한 메서드는 uiview UIResponder의 기본 클래스인에 정의 되어 있습니다.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– 사용자가 화면 주위에서 손가락을 이동할 때 터치 위치가 변경 될 때 호출 됩니다.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. TouchesCancellediOS가 터치를 취소 하는 경우 호출 됩니다. 예를 들어 사용자가 단추에서 손가락을 이동 하 여 누르기를 취소 하는 경우를 예로 들 수 있습니다.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.

터치 이벤트는 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 에서 호출 된 UIView 다음 뷰 계층 구조에 있는 UIViewControllers 및에서 호출 됩니다.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.

사용자가 화면에 닿을 때마다 개체가생성됩니다.UITouchA 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에서 touch 이벤트를 이해 했으므로 제스처 인식기에 대해 알아보겠습니다.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 – 손가락을 집기 하 고 분산 합니다.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. 인스턴스의UIGestureRecognizer 동작을 제어 하기 UIGestureRecognizer 위해 설정할 수 있는 속성 목록은 및 해당 서브 클래스에 대 한 Xamarin 설명서를 참조 하세요.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. 목표 구성 -C heritage 때문에 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 )가 있습니다 .이 메서드는 코드를 사용 하 여 무명 대리자 또는 목표-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. UIGestureRecognizer 하위 클래스에 사용할 수 있는 데이터에 대 한 자세한 내용은 Xamarin 설명서를 참조 하세요.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 에는 제스처 인식기의 상태에 대 한 중요 한 정보를 제공 하는 State 속성이 있습니다.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. 상태 속성의 기본값입니다.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 – 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로 변경 됩니다.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. 기본 클래스의 State 속성을 통해 인식 상태를 버블링 합니다.Bubble up recognition status via the base class’ State property.

이에 대 한 실질적인 예는 iOS에서 Touch 사용 연습에서 설명 합니다.A practical example of this will be covered in the Using Touch in iOS walkthrough.