Използване на pointInside:withEvent: за различни жестове

Имам два изгледа A и B. B е подизглед на A. Искам да наблюдавам действията с двойно докосване в A, в този случай ще преместя B в позиция за докосване.

Сега искам да направя тази част от кодовете вътре в B, което ще избегне кодирането в A.

Затова добавих разпознавател на жестове с двойно докосване в B и презаписах -pointInside:withEvent: в B, така че да може да реагира на действие с двойно докосване извън рамката на B.

Все пак искам други жестове (включително едно докосване) да работят на A, така че измислих два различни начина как да направя това:

  1. Разпознайте вътре pointInside: и за едно докосване върнете NO, за двойно докосване∫ върнете YES, но изглежда, че няма начин да направите това.
  2. Винаги връщайте YES за pointInside: и улавяйте както единични докосвания, така и жестове с двойно докосване. За жестове с едно докосване го изпратете на A за обработка, но все още не намирате начин за това.

Някой може ли да ми помогне с това? Или кажете дали гледам в грешна посока?


person jeff wu    schedule 26.07.2013    source източник


Отговори (1)


Този подход може да работи, но е много объркан, просто защото pointInside:withEvent: е много примитивно извикване.

Когато докоснете два пъти върху изглед, ще получите множество извиквания на метод hitTest:withEvent: (които от своя страна извикват pointInisde:withEvent:), което означава, че ще трябва да свършите упорита работа, като използвате отместване във времето, за да измервате всеки път, когато се появят две докосвания след другия.

Колко обаждания получава? Колкото може повече, всяка милисекунда, в която пръстът ви почива върху екрана, този метод ще бъде бомбардиран килим от извиквания на метод. Просто не е разумно да го претоварвате за това, което възнамерявате да правите.

Казано по-просто, разпознавателите на жестове са много удобни обекти, които капсулират всички сложности на това да се налага да се справяте сами в реално време UITouch.

Като решение, което поддържа кода сравнително чист, можете да добавите UITapGestureRecognizer към A и след това да подадете селектора за B за обработка, можете дори да направите това в създателя на интерфейс или чрез код:

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:B action:@selector(handleGesture:)];
tapGesture.numberOfTapsRequired = 2;

[A addGestureRecognizer:tapGesture];

(A и B са вашите мнения)

person Can    schedule 26.07.2013
comment
Работи, с изключение на това, че в B няма изглед за изяждане на събитието, да речем, uiwebview може да обработва дългото натискане, двойното докосване и т.н... Най-накрая презаписвам sendevent и правя някакъв манипулатор на известия. - person jeff wu; 31.07.2013
comment
Не съм напълно сигурен какво питаш. B също е изглед, така че трябва да може да обработва събития - person Can; 31.07.2013