Подтвердить что ты не робот

UIView, как определить, когда штрихи вошли в представление

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

В случае, если это имеет значение, мое конкретное приложение предназначено для перетаскивания MKPinAnnotationView (с использованием встроенного перетаскивания 4,0). Я хочу, чтобы что-то произошло, если пользователь перетащил булавку на другой вид (что тоже может быть AnnotationView, но это может быть что угодно). Метод перетаскивания не вызывается до тех пор, пока я не отпущу штырь; и ни один из методов невозможен, чтобы UIView, который перетаскивался, кажется вызванным, если я не начал, касаясь изнутри представления.

Поскольку супервизор - это MKMapView, трудно просто использовать событие touchhesMoved и проверить, находится ли пользователь в нужном месте или нет. Спасибо!

4b9b3361

Ответ 1

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

Оказывается, вы можете подклассифицировать UIGestureRecognizer; и он обрабатывает все касания для представления, которое оно было добавлено (включая MKMapView). Это позволяет всем нормальным взаимодействиям MKMapView по-прежнему вести себя без проблем; но также предупреждает меня о прикосновениях. В прикосновениях, я просто проверяю местоположение касания; и посмотрите, находится ли он в пределах моего другого представления.

Из всего, что я пробовал; это, по-видимому, единственный способ перехватить touchhesMoved, когда пользователь перетаскивает MKAnnotation.

Ответ 2

Вы можете:

(HitstateView.h)

#import <UIKit/UIKit.h>


@interface HitstateView : UIView {
    id overrideObject;
}

@property (nonatomic, retain) id overrideObject;

@end

(HitstateView.m)

#import "HitstateView.h"


@implementation HitstateView

@synthesize overrideObject;

- (void)dealloc {
    self.overrideObject = nil;

    [super dealloc];
}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *hitView = [super hitTest:point withEvent:event];
    if (hitView == self) {
        return overrideObject;
    }
    return hitView;
}

@end

Сделайте так, чтобы размер вашей сенсорной области отображался. Установите объект overideObject в представление, в котором вы хотите, чтобы изменения касались. IIRC, он должен быть подходом к HitStateView.

Ответ 3

Каждое представление наследует UIResponder, поэтому каждое представление получает touchBegan/Moved/Ended. Я не думаю, что начало касания вне представления означает, что в представлении не происходит никакого события, когда касание перемещается над представлением. Если вы хотите получить уведомление о том, что что-то было перетащено на ваш MKMapView, вы должны сделать подкласс, который обрабатывает касание, но затем передает событие на super, позволяя иерархии делать все, что нужно, с помощью касания. Вам не нужно захватывать или изменять событие, просто наблюдайте его.

Ответ 4

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

Вы также можете играть в трюки с форвард-событиями с помощью теста на отмену атаки:

http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html%23//apple_ref/doc/uid/TP40009541-CH3-SW3

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