paramSender.state!= UIGestureRecognizerStateFailed){
CGPoint location = [paramSender
locationInView: paramSender.view.superview];
paramSender.view.center = location;
}
}
Чтобы можно было перемещать метку вида, относящегося к контроллеру вида, нам нужно знать не положение метки, а положение пальца на виде. Поэтому мы вызываем метод locationInView: распознавателя жестов панорамирования и передаем родительский вид метки в качестве целевого.
Воспользуйтесь методом locationInView: распознавателя жестов панорамирования, чтобы найти позиции пальцев (или пальца), которые в настоящее время совершают этот жест. Чтобы найти положение нескольких пальцев, пользуйтесь методом locationOfTouch: inView:. С помощью свойств minimumNumberOfTouches и maximumNumberOfTouches класса UIPanGestureRecognizer можно одновременно регистрировать более одного панорамирующего касания. Но в примере ради простоты мы пытаемся найти положение всего одного пальца.
В состоянии UIGestureRecognizerStateEnded сообщаемые значения x и y могут быть и нечисловыми — они могут равняться NAN. Вот почему необходимо избегать использования значений, сообщаемых именно в этом конкретном состоянии.
10.4. Обнаружение жестов долгого нажатия
Необходимо обнаруживать ситуации, в которых пользователь нажимает определенный экранный элемент и удерживает палец на экране в течение некоторого периода времени.
Создайте экземпляр класса UILongPressGestureRecognizer и добавьте его к виду, в котором требуется распознавать жесты долгого нажатия. h-файл контроллера вида будет определяться следующим образом:
#import «ViewController.h»
@interface ViewController ()
@property (nonatomic, strong)
UILongPressGestureRecognizer *longPressGestureRecognizer;
@property (nonatomic, strong) UIButton *dummyButton;
@end
@implementation ViewController
Далее приведен метод экземпляра viewDidLoad, относящийся к контроллеру вида, где используется распознаватель долгих нажатий. Этот распознаватель реализован в следующем. m-файле:
— (void)viewDidLoad {
[super viewDidLoad];
self.dummyButton = [UIButton buttonWithType: UIButtonTypeRoundedRect];
self.dummyButton.frame = CGRectMake(0.0f,
0.0f,
72.0f,
37.0f);
self.dummyButton.center = self.view.center;
[self.view addSubview: self.dummyButton];
/* Сначала создаем распознаватель жестов. */
self.longPressGestureRecognizer =
[[UILongPressGestureRecognizer alloc]
initWithTarget: self
action:@selector(handleLongPressGestures:)];
/* Количество пальцев, которые должны находиться на экране. */
self.longPressGestureRecognizer.numberOfTouchesRequired = 2;
/* Допускается движение не более чем на 100 точек,
прежде чем жест будет распознан. */
self.longPressGestureRecognizer.allowableMovement = 100.0f;
/* Пользователь должен прижать к экрану два пальца
(numberOfTouchesRequired) как минимум на секунду, чтобы жест
был распознан. */
self.longPressGestureRecognizer.minimumPressDuration = 1.0;
/* Добавляем этот распознаватель жестов к виду. */
[self.view addGestureRecognizer: self.longPressGestureRecognizer];
}
Если распознаватель долгих нажатий инициирует события, отправляемые объекту-получателю, а пользователь продолжает совершать такой жест и в этой ситуации поступает входящий звонок либо наступает какое-то иное прерывание, то распознаватель жестов перейдет в состояние UIGestureRecognizerStateCancelled. Объекту-получателю не будет поступать никакой информации от распознавателя жестов до тех пор, пока пользователь снова не совершит всю последовательность действий, требуемых, чтобы возобновился процесс распознавания. В данном примере распознавание возобновится после удержания хотя бы двух пальцев на виде в контроллере вида, и нажатие должно длиться не менее 1 секунды.
Код работает в контроллере вида со свойством longPressGestureRecognizer типа UILongPressGestureRecognizer. Этот аспект подробнее рассмотрен в подразделе «Решение» данного раздела.
В составе iOS SDK есть класс для распознавания долгих нажатий, который называется UILongTapGestureRecognizer. Жест долгого нажатия инициируется, когда пользователь нажимает одним или несколькими пальцами (количество пальцев в данном случае задает программист) вид UIView и удерживает палец (или пальцы) в этой точке на протяжении определенного количества секунд. Учитывайте, что долгие нажатия — это непрерывные события.
На работу распознавателя жестов долгих нажатий влияют четыре важных свойства:
• numberOfTapsRequired — это количество нажатий целевого вида, которые пользователь должен совершить, прежде чем может быть инициирован жест долгого нажатия. Не забывайте, что нажать — это не просто прикоснуться пальцем к экрану. Нажатие — это движение, при котором палец сначала прижимается к экрану, а потом отрывается от него. По умолчанию это свойство имеет значение 0;
Читать дальше
Конец ознакомительного отрывка
Купить книгу