События касания и жестов в Xamarin.iOSTouch Events and Gestures in Xamarin.iOS

Важно понимать события касания и touch API-интерфейсы в приложение iOS, так как они являются основой всех физических взаимодействий с устройством.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 Designer, как показано на следующем снимке экрана: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. Это необходимо, если пользовательский Интерфейс создается в коде.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 — Вызывается, если расположение изменения сенсорного ввода имени пользователя скользит пальцами по экрану.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 отменяет touch — например, если пользователь слайды свой пальцем от отменять нажатие кнопки.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.

Touch рекурсивно события перемещения по стеку 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.

Объект 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 — нажмите и удерживайте клавишу, иногда называют press долго или щелчком долго.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 имеет свойство 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. Если пользовательского распознавателя никогда не обновляет свойство State, подписчика никогда не вызывается, Подготовка к просмотру распознавания бесполезными.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. Дискретные — эти жесты единственный fire первый случай, когда они распознаются.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 — после распознавания непрерывной жест Began присваивается состояние.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.
  • Отменено — это состояние устанавливается, если распознаватель учились Began Changed, а затем штрихи, изменены таким образом, как для больше не относятся к закономерности жеста.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. Всплывать распознавания состояния с помощью свойства State базового класса.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.