Чтение онлайн

ЖАНРЫ

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

self.helloWorldLabel.text = @"Hello World";

self.helloWorldLabel.backgroundColor = [UIColor blackColor];

self.helloWorldLabel.textColor = [UIColor whiteColor];

self.helloWorldLabel.textAlignment = UITextAlignmentCenter;

/* Убеждаемся, что мы активизировали пользовательские взаимодействия;

в противном случае эта метка не будет фиксировать события нажатия. */

self.helloWorldLabel.userInteractionEnabled = YES;

/* А
теперь убеждаемся, что метка отображается в виде. */

[self.view addSubview: self.helloWorldLabel];

/* Создаем распознаватель жестов панорамирования. */

self.panGestureRecognizer = [[UIPanGestureRecognizer alloc]

initWithTarget: self

action:@selector(handlePanGestures:)];

/* Для активизации распознавателя жестов панорамирования требуется

один палец. */

self.panGestureRecognizer.minimumNumberOfTouches = 1;

self.panGestureRecognizer.maximumNumberOfTouches = 1;

/* Добавляем распознаватель к виду. */

[self.helloWorldLabel addGestureRecognizer: self.panGestureRecognizer];

}

Распознаватель жестов панорамирования будет вызывать метод handlePanGestures: в качестве целевого. Этот метод описан в подразделе «Решение» данного раздела.

Обсуждение

Распознаватель UIPanGestureRecognizer, как понятно из его названия [9] , способен обнаруживать жесты панорамирования. В ходе работы этот распознаватель проходит через следующие состояния:

• UIGestureRecognizerStateBegan;

• UIGestureRecognizerStateChanged;

• UIGestureRecognizerStateEnded.

Целевой метод этого распознавателя жестов можно реализовать следующим образом. Приведенный код будет непрерывно перемещать центр метки вслед за пальцем пользователя, и на протяжении этого процесса будет сообщаться о событиях GestureRecognizerStateChanged:

9

Pan (англ.) — «панорамирование», recognizer (англ.) — «распознаватель». — Примеч. пер.

— (void) handlePanGestures:(UIPanGestureRecognizer*)paramSender{

if (paramSender.state!= UIGestureRecognizerStateEnded &&

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;

/* Пользователь должен прижать к экрану два пальца

Поделиться с друзьями: