Помещение UIButton и других объектов UIControl в MKAnnotationView и разрешение взаимодействия с пользователем

У меня есть пользовательский вид аннотации на карте, в котором есть UIButton, но UIButton не реагирует на нажатие. У меня есть две основные проблемы с пользовательским взаимодействием в представлении аннотации:

  1. Кнопки и другие элементы управления не реагируют.
  2. Я хочу, чтобы аннотация блокировала касания в соответствии с моей реализацией - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event - то есть, если я возвращаю YES, тогда я не хочу касания, которые будут отправлены на MKMapView (возможно, выбрав другие аннотации, ЗАКЛЮЧЕННЫЕ моим видом аннотации), я хочу обработать касание самостоятельно в этом случае.

Я убедился, что для userInteractionEnabled установлено значение YES и я исследовал, как касания отправляются в пользовательский вид аннотации (мой подкласс MKAnnotationView) путем переопределения touchesBegan и т. Д. - но кажется, что касания обычно отменяются (хотя мне удалось получить touchesEnded несколько раз), поэтому даже вручную будет сложно реализовать любое взаимодействие с пользователем с помощью настраиваемого представления аннотаций.

Есть ли у кого-нибудь идеи, как разрешить больше взаимодействия пользователя с объектами MKAnnotationView?

7 голосов | спросил jhabbott 28 J000000Thursday11 2011, 21:10:47

4 ответа


0

Мне удалось решить эту проблему с помощью коллеги. Решение состоит в том, чтобы переопределить - (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event. Мы предполагаем, что MKAnnotationView (от которого ваше представление аннотации должно наследовать) переопределяет это, чтобы сделать «неправильную» вещь (предположительно, чтобы выбор аннотации не блокируется между перекрывающимися аннотациями). Таким образом, вы должны переопределить его, чтобы сделать правильную вещь и вернуть соответствующий UIView, тогда система отправит ему события и пользователь сможет взаимодействовать с ним :). Это имеет полезный (в данном случае) побочный эффект, заключающийся в том, что интерактивная аннотация блокирует выбор аннотаций, стоящих за ним.

ответил jhabbott 26 PM00000040000004731 2011, 16:57:47
0

Я обнаружил, что вместо переопределения hitTest:withEvent: я могу просто переопределить pointInside:withEvent: и просто заставить его вернуть YES. Я предполагаю, что официально я должен делать проверку точки-прямоугольника на пересечение, чтобы убедиться, что место, которое я касаюсь, находится внутри элемента управления, но на практике просто помещаем return YES, кажется, работает отлично, все еще позволяя вам закрыть MKAnnotationView, нажав на него.

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{   
    // for testing purposes
    BOOL result = [super pointInside:point withEvent:event];
    NSLog(@"pointInside:RESULT = %i", result);

    return YES;
}
ответил jowie 24 +04002011-10-24T19:35:58+04:00312011bEurope/MoscowMon, 24 Oct 2011 19:35:58 +0400 2011, 19:35:58
0

В дополнение к ответу jhabbott, это то, что сработало для меня. У меня есть пользовательский вид аннотации MKCustomAnnotationView, который содержит пользовательскую аннотацию CustomPin в качестве аннотации. Этот «вывод» содержит UIButton в качестве замены кнопки аксессуара, которую я хотел получить для сенсорных событий.

Мой метод hitTest будет выглядеть следующим образом:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *result = [super hitTest:point withEvent:event];
    //NSLog(@"ht: %f:%f %d %@", point.x, point.y, [[event touchesForView:self] count], result);

    if ([result isKindOfClass:[MKCustomAnnotationView class]])
    {
        MKCustomAnnotationView *av = (MKCustomAnnotationView *)result;
        CustomPin *p = av.annotation;
        UIButton *ab = p.accessoryButton;
        if (p.calloutActive && point.x >= ab.frame.origin.x)
            return ab;
    }

    return result;
}

В большинстве случаев в calloutActive bool, вероятно, нет необходимости.

ответил jimpic 2 PMpTue, 02 Apr 2013 16:15:27 +040015Tuesday 2013, 16:15:27
0

Для тех, кто хочет добавить tapGesture к подпредставлению AnnotationView, ответьте в нижней части этого:

MKannotationView с UIButton в качестве подпредставления, кнопка не отвечает

Работал для меня:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if (CGRectContainsPoint(_button.frame, point)) {
        return _button;
    }
    return [super hitTest:point withEvent:event];
}
ответил Morgz 25 FebruaryEurope/MoscowbThu, 25 Feb 2016 13:35:30 +0300000000pmThu, 25 Feb 2016 13:35:30 +030016 2016, 13:35:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132