Как сохранить сенсорное событие после добавления нового вида долгим нажатием - PullRequest
2 голосов
/ 27 октября 2010

Когда я добавляю новый вид после обнаружения долгого нажатия пользователя, я получаю событие touchesCancelled. Однако я хочу сохранить событие длинного нажатия для вновь добавленного представления.

Что я хочу реализовать, так это то, что пользователь касается экрана и удерживает его, затем добавляется новый вид, и пользователь может перемещать касание во вновь добавленном виде без касания и снова касаться.

Но когда добавляется новый вид, я получаю событие отмены касания, поэтому добавленное представление не может получить событие касания, даже если касание пользователя движется.

Я использую UILongPressGestureRecognizer для обнаружения длительного нажатия пользователя.

ниже - лог-сообщение.

MyView касается Beg x: 524 y: 854

MyView handleLongPress (обнаружен LongPress)

Добавлен NewView

Касания MyViewОтменено x: 526 y: 854

и ничего не случилось ...

я ожидаю, что ...

MyView касается Beg x: 524 y: 854

MyView handleLongPress (обнаружен LongPress)

Добавлен NewView

Касания MyViewОтменено x: 526 y: 854

NewView touchBegan

NewView touchMoved

NewView touchMoved

NewView touchMoved

NewView touchMoved

...

Есть ли какое-нибудь решение?

Заранее спасибо.

1 Ответ

0 голосов
/ 27 мая 2012

Это хитроумно - моя идея решения немного ошибочна, но я думаю, что это сработает.

Добавьте прозрачный вид на всю область, и это вид, который вы добавляетераспознаватель жестов при длинном нажатии.Я назову это видом перехватчика, а тот, что позади, будет называться видимым видом.Когда вы обнаружите долгое нажатие на виде перехватчика, вы можете добавить новый вид к видимому виду, не влияя на прикосновения на виде перехватчика, поэтому вы можете отслеживать их и перемещать новый вид на видимом виде.

Если вам нужно обнаружить другие касания, например, в кнопках и других элементах пользовательского интерфейса, которые находятся в видимом представлении, то вы должны создать подкласс UIView (InterceptorView) для представления перехватчика и переопределить hitTest:withEvent: какследует:

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
    // Notes:
    // visibleView is a property of your InterceptorView class
    // which should be set to the visible view when the interceptor
    // view is created and added over the top of the visible view.

    // See if there are any views in the visible view that should receive touches...
    // Since the frame of the interceptor view should be the same as the frame of the
    // visible view then the point doesn't need coordinate conversion.
    UIView* passThroughView = [self.visibleView hitTest:point withEvent:event];
    if(passThroughView == nil)
    {
        // The visible view and its sub-views don't want to receive this touch
        // which means it is safe for me to intercept it.
        return self;
    }
    // The visible view wants this touch, so tell the system I don't want it.
    return nil;
}

Это будет означать, что ваше представление перехватчика будет обрабатывать длительное нажатие, кроме случаев, когда нажатие находится над интерактивной частью видимого представления, в этом случае это позволит касанию проходить квидимый вид и его подвиды.

Я не проверял это, это всего лишь идея, поэтому, пожалуйста, дайте мне знать, как вы справляетесь с этим:)

...