Вопрос по objective-c, ios – Как перехватить события касаний на объектах MKMapView или UIWebView?

95

Я не уверен, что делаю не так, но стараюсь уловитьMKMapView объект. Я вложил его в подкласс, создав следующий класс:

<code>#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>

@interface MapViewWithTouches : MKMapView {

}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *) event;   

@end
</code>

И реализация:

<code>#import "MapViewWithTouches.h"
@implementation MapViewWithTouches

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *) event {

    NSLog(@"hello");
    //[super touchesBegan:touches   withEvent:event];

}
@end
</code>

Но, похоже, когда я использую этот класс, я ничего не вижу на консоли:

<code>MapViewWithTouches *mapView = [[MapViewWithTouches alloc] initWithFrame:self.view.frame];
[self.view insertSubview:mapView atIndex:0];
</code>

Есть идеи, что я делаю не так?

Ваш Ответ

14   ответов
144

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

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

Как обнаружить любое нажатие внутри MKMapView (без трюков)
WildcardGestureRecognizer * tapInterceptor = [[WildcardGestureRecognizer alloc] init];
tapInterceptor.touchesBeganCallback = ^(NSSet * touches, UIEvent * event) {
        self.lockedOnUserLocation = NO;
};
[mapView addGestureRecognizer:tapInterceptor];
WildcardGestureRecognizer.h
//
//  WildcardGestureRecognizer.h
//  Copyright 2010 Floatopian LLC. All rights reserved.
//

#import <Foundation/Foundation.h>

typedef void (^TouchesEventBlock)(NSSet * touches, UIEvent * event);

@interface WildcardGestureRecognizer : UIGestureRecognizer {
    TouchesEventBlock touchesBeganCallback;
}
@property(copy) TouchesEventBlock touchesBeganCallback;


@end
WildcardGestureRecognizer.m
//
//  WildcardGestureRecognizer.m
//  Created by Raymond Daly on 10/31/10.
//  Copyright 2010 Floatopian LLC. All rights reserved.
//

#import "WildcardGestureRecognizer.h"


@implementation WildcardGestureRecognizer
@synthesize touchesBeganCallback;

-(id) init{
    if (self = [super init])
    {
        self.cancelsTouchesInView = NO;
    }
    return self;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (touchesBeganCallback)
        touchesBeganCallback(touches, event);
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
}

- (void)reset
{
}

- (void)ignoreTouch:(UITouch *)touch forEvent:(UIEvent *)event
{
}

- (BOOL)canBePreventedByGestureRecognizer:(UIGestureRecognizer *)preventingGestureRecognizer
{
    return NO;
}

- (BOOL)canPreventGestureRecognizer:(UIGestureRecognizer *)preventedGestureRecognizer
{
    return NO;
}

@end
SWIFT 3
let tapInterceptor = WildCardGestureRecognizer(target: nil, action: nil)
tapInterceptor.touchesBeganCallback = {
    _, _ in
    self.lockedOnUserLocation = false
}
mapView.addGestureRecognizer(tapInterceptor)

WildCardGestureRecognizer.swift

import UIKit.UIGestureRecognizerSubclass

class WildCardGestureRecognizer: UIGestureRecognizer {

    var touchesBeganCallback: ((Set<UITouch>, UIEvent) -> Void)?

    override init(target: Any?, action: Selector?) {
        super.init(target: target, action: action)
        self.cancelsTouchesInView = false
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        super.touchesBegan(touches, with: event)
        touchesBeganCallback?(touches, event)
    }

    override func canPrevent(_ preventedGestureRecognizer: UIGestureRecognizer) -> Bool {
        return false
    }

    override func canBePrevented(by preventingGestureRecognizer: UIGestureRecognizer) -> Bool {
        return false
    }
}
для чего "lockedOnUserLocation"? jowie
это посторонняя переменная, характерная для моего приложения. он отслеживает, должна ли система автоматически центрировать карту на текущем местоположени gonzojive
Это прекрасно работает по большей части, но я нашел одну проблему с ним. Если HTML в вашем веб-представлении содержит HTML5video тег с элементами управления, распознаватель жестов не позволит пользователю использовать элементы управления. Я искал обходной путь для этого, но еще не нашел его. Bryan Irace
Это идеальное решение. Мне нужно одно пояснение: в методе «- (void) touchesBegan: (NSSet *) затрагивает событие« Event: (UIEvent *) », какова цель использования кода: if (touchesBeganCallback) touchesBeganCallback (touches, event); Satyam
+ 1 "наименее навязчивый" csch
29

Peter, я использовал твой трюк выше и немного подправил его, чтобы наконец-то найти решение, которое прекрасно работает с MKMapView и должно работать также с UIWebView

MKTouchAppDelegate.h

#import <UIKit/UIKit.h>
@class UIViewTouch;
@class MKMapView;

@interface MKTouchAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    UIViewTouch *viewTouch;
    MKMapView *mapView;
}
@property (nonatomic, retain) UIViewTouch *viewTouch;
@property (nonatomic, retain) MKMapView *mapView;
@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

MKTouchAppDelegate.m

#import "MKTouchAppDelegate.h"
#import "UIViewTouch.h"
#import <MapKit/MapKit.h>

@implementation MKTouchAppDelegate

@synthesize window;
@synthesize viewTouch;
@synthesize mapView;


- (void)applicationDidFinishLaunching:(UIApplication *)application {

    //We create a view wich will catch Events as they occured and Log them in the Console
    viewTouch = [[UIViewTouch alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

    //Next we create the MKMapView object, which will be added as a subview of viewTouch
    mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
    [viewTouch addSubview:mapView];

    //And we display everything!
    [window addSubview:viewTouch];
    [window makeKeyAndVisible];


}


- (void)dealloc {
    [window release];
    [super dealloc];
}


@end

UIViewTouch.h

#import <UIKit/UIKit.h>
@class UIView;

@interface UIViewTouch : UIView {
    UIView *viewTouched;
}
@property (nonatomic, retain) UIView * viewTouched;

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

@end

UIViewTouch.m

#import "UIViewTouch.h"
#import <MapKit/MapKit.h>

@implementation UIViewTouch
@synthesize viewTouched;

//The basic idea here is to intercept the view which is sent back as the firstresponder in hitTest.
//We keep it preciously in the property viewTouched and we return our view as the firstresponder.
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    NSLog(@"Hit Test");
    viewTouched = [super hitTest:point withEvent:event];
    return self;
}

//Then, when an event is fired, we log this one and then send it back to the viewTouched we kept, and voilà!!! :)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Touch Began");
    [viewTouched touchesBegan:touches withEvent:event];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Touch Moved");
    [viewTouched touchesMoved:touches withEvent:event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Touch Ended");
    [viewTouched touchesEnded:touches withEvent:event];
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Touch Cancelled");
}

@end

Надеюсь, это поможет некоторым из вас!

Ура

Ницца. Небольшое предложение: вам следует избегать называть свои собственные классы префиксом пользовательского интерфейса. Apple резервирует / не рекомендует использовать NS или UI в качестве префикса класса, потому что это может привести к конфликту с классом Apple (даже если это частный класс). Daniel Dickison
Очень полезный код, спасибо Мартин! Мне было интересно, если вы пытались увеличить масштаб карты после реализации этого? Для меня, когда я начал работать, используя в основном тот же код, который у вас был выше всего, казалось, работал, кроме масштабирования карты с помощью пинча. У кого-нибудь есть идеи? Adam Alexander
Хорошо, я проголосовал за этот вопрос, потому что изначально он решил мою проблему. ТЕМ НЕ МЕНИЕ...! Я не могу заставить работать мультитач. То есть, несмотря на то, что я непосредственно передаю touchesBegan и touchsMoved для viewTouched (я делаю перехват на touchShended), я не могу увеличить карту с помощью жестов. (Продолжение ...) Olie
Эй, Даниэль, ты совершенно прав, я тоже так думал! Чтобы завершить мой ответ выше, позвольте мне добавить небольшое предупреждение: Мой пример предполагает, что есть только один объект viewTouched, который потребляет все события. Но это не правда. У вас может быть несколько аннотаций поверх вашей карты, и тогда мой код больше не работает. Чтобы работать на 100%, вам нужно помнить для каждого hitTest представление, связанное с этим конкретным событием (и в конечном итоге освобождать его при срабатывании touchesEnded или touchesCancelled, поэтому вам не нужно отслеживать законченные события ...). Martin
Эй, Адам, у меня тоже есть это ограничение, и я не совсем понимаю, почему! Это действительно раздражает. Если вы найдете решение, дайте мне знать! Спасиб Martin
12
Для MKMapView реальным рабочим решением является распознавание жестов!

когда я перетаскивал карту или ущипывал, чтобы увеличить.

Итак, создайте и добавьте свой распознаватель жестов в mapView:

- (void)viewDidLoad {

    ...

    // Add gesture recognizer for map hoding
    UILongPressGestureRecognizer *longPressGesture = [[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressAndPinchGesture:)] autorelease];
    longPressGesture.delegate = self;
    longPressGesture.minimumPressDuration = 0;  // In order to detect the map touching directly (Default was 0.5)
    [self.mapView addGestureRecognizer:longPressGesture];

    // Add gesture recognizer for map pinching
    UIPinchGestureRecognizer *pinchGesture = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressAndPinchGesture:)] autorelease];
    pinchGesture.delegate = self;
    [self.mapView addGestureRecognizer:pinchGesture];

    // Add gesture recognizer for map dragging
    UIPanGestureRecognizer *panGesture = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)] autorelease];
    panGesture.delegate = self;
    panGesture.maximumNumberOfTouches = 1;  // In order to discard dragging when pinching
    [self.mapView addGestureRecognizer:panGesture];
}

ПосмотриUIGestureRecognizer Class Reference чтобы увидеть все доступные средства распознавания жестов.

Поскольку мы определили делегата для себя, мы должны реализовать протокол UIGestureRecognizerDelegate:

typedef enum {
    MapModeStateFree,                    // Map is free
    MapModeStateGeolocalised,            // Map centred on our location
    MapModeStateGeolocalisedWithHeading  // Map centred on our location and oriented with the compass
} MapModeState;

@interface MapViewController : UIViewController <CLLocationManagerDelegate, UIGestureRecognizerDelegate> {
    MapModeState mapMode;
}

@property (nonatomic, retain) IBOutlet MKMapView *mapView;
...

И переопределить метод gestRecognizer: gestRecognizer долженRecognizeSim одновременноouslyWithGestureRecognizer: чтобы разрешить распознавать несколько жестов одновременно, если я правильно понял:

// Allow to recognize multiple gestures simultaneously (Implementation of the protocole UIGestureRecognizerDelegate)
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

Теперь напишите методы, которые будут вызываться нашими распознавателями жестов:

// On map holding or pinching pause localise and heading
- (void)handleLongPressAndPinchGesture:(UIGestureRecognizer *)sender {
    // Stop to localise and/or heading
    if (sender.state == UIGestureRecognizerStateBegan && mapMode != MapModeStateFree) {
        [locationManager stopUpdatingLocation];
        if (mapMode == MapModeStateGeolocalisedWithHeading) [locationManager stopUpdatingHeading];
    }
    // Restart to localise and/or heading
    if (sender.state == UIGestureRecognizerStateEnded && mapMode != MapModeStateFree) {
        [locationManager startUpdatingLocation];
        if (mapMode == MapModeStateGeolocalisedWithHeading) [locationManager startUpdatingHeading];
    }
}

// On dragging gesture put map in free mode
- (void)handlePanGesture:(UIGestureRecognizer *)sender {
    if (sender.state == UIGestureRecognizerStateBegan && mapMode != MapModeStateFree) [self setMapInFreeModePushedBy:sender];
}
Это решение идеально! Некоторые быстрые здесь: Если вы хотите перехватить, когда пользователь заканчивает выполнение какого-либо действия, использующего это, то должно быть достаточно ; }} Alejandro Luengo
Это замечательно - спасибо. Мультитач работает просто отлично. Joe D'Andrea
Также не забудьте добавить делегата <UIGestureRecognizerDelegate> Alejandro Luengo
22
UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleGesture:)];   
tgr.numberOfTapsRequired = 2;
tgr.numberOfTouchesRequired = 1;
[mapView addGestureRecognizer:tgr];
[tgr release];


- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer.state != UIGestureRecognizerStateEnded)
        return;

    CGPoint touchPoint = [gestureRecognizer locationInView:mapView];
    CLLocationCoordinate2D touchMapCoordinate = [mapView convertPoint:touchPoint toCoordinateFromView:mapView];

    //.............
}
Я не уверен, почему это не самый лучший ответ. Кажется, работает отлично, и гораздо проще. elsurudo
5

я хотел создать аннотацию в точке, где пользователь нажимает. Для этого я использовалUITapGestureRecognizer решение

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapOnMap:)];
[self.mapView addGestureRecognizer:tapGestureRecognizer];
[tapGestureRecognizer setDelegate:self];

- (void)didTapOnMap:(UITapGestureRecognizer *)gestureRecognizer
{
    CGPoint point = [gestureRecognizer locationInView:self.mapView];
    CLLocationCoordinate2D coordinate = [self.mapView convertPoint:point toCoordinateFromView:self.mapView];
    .......
}

Тем не мение,didTapOnMap: также был вызван, когда я нажал на аннотацию, и новая была создана. Решение заключается в реализацииUIGestureRecognizerDelegate:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([touch.view isKindOfClass:[MKAnnotationView class]])
    {
        return NO;
    }
    return YES;
}
Это отличное решение! Но это не работает, если вы используете пользовательское представление какMKAnnotation. В этом случае у вас может быть подпредставление другой аннотации, запускающее распознаватель жестов. Мне пришлось рекурсивно проверять суперпредставление touch.view, чтобы найти потенциальный MKAnnotationView KIDdAe
1

Как и все остальные, пинчинг не работает. Я попробовал как подкласс MKMapView, так и метод, описанный выше (перехват). И результат тот же.

В видео со Стэнфорда на iPhone парень из Apple говорит, что многие вещи из UIKit приведут к множеству ошибок, если вы «передадите» запросы касания (так называемые два метода, описанные выше), и вы, вероятно, не сможете заставить его работать .

РЕШЕНИ: описано здесь: Перехват / похищение событий касания iPhone для MKMapView. Обычно вы «ловите» событие до того, как его получит любой респондент, и интерпретируете его там.

1

В Swift 3.0

import MapKit

class CoordinatesPickerViewController: UIViewController {

    @IBOutlet var mapView: MKMapView!
    override func viewDidLoad() {
        super.viewDidLoad()

        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clickOnMap))
        mapView.addGestureRecognizer(tapGestureRecognizer)
    }

    @objc func clickOnMap(_ sender: UITapGestureRecognizer) {

        if sender.state != UIGestureRecognizerState.ended { return }
        let touchLocation = sender.location(in: mapView)
        let locationCoordinate = mapView.convert(touchLocation, toCoordinateFrom: mapView)
        print("Tapped at lat: \(locationCoordinate.latitude) long: \(locationCoordinate.longitude)")

    }

}
3

вероятно, потребуется наложить прозрачное представление, чтобы поймать прикосновения, как это часто делается с элементами управления на основе UIWebView. Представление «Карта» уже выполняет несколько специальных действий одним касанием, чтобы позволить карте перемещаться, центрироваться, масштабироваться и т. Д., Чтобы сообщения не попадали в ваше приложение.

Два других (непроверенных) варианта, о которых я могу подумать:

1) Оставьте первого респондента через IB и установите для него «Владелец файла», чтобы владелец файла мог реагировать на прикосновения. Я сомневаюсь, что это будет работать, потому что MKMapView расширяет NSObject, а не UIView, и в результате сенсорные события все еще могут не распространяться до вас.

2) Если вы хотите перехватывать данные при изменении состояния карты (например, при увеличении), просто реализуйте протокол MKMapViewDelegate для прослушивания определенных событий. Я догадываюсь, что это ваш лучший способ легко поймать какое-то взаимодействие (если не считать прозрачного просмотра карты). Не забудьте установить View Controller, содержащий MKMapView, в качестве делегата карты map.delegate = self).

Удачи

MKMapView определенно подклассы UIView. Daniel Dickison
0

multipletouchenabled будет работать время от времени.

viewTouch.multipleTouchEnabled = TRUE;

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

    [mapView removeFromSuperview];
    [viewTouch addSubview:mapView];
    [self.view insertSubview:viewTouch atIndex:0];
but не работает с масштабированием в реальном времени. Это также, кажется, всегда уменьшает масштаб. Rog
0

что вы можете отслеживать количество и местоположение касаний и определять местоположение каждого в представлении:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Touch Moved %d", [[event allTouches] count]);

 NSEnumerator *enumerator = [touches objectEnumerator];
 id value;

 while ((value = [enumerator nextObject])) {
  NSLog(@"touch description %f", [value locationInView:mapView].x);
 }
    [viewTouched touchesMoved:touches withEvent:event];
}

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

Я играю с базовым кодом, предоставленным Мартином, и похоже, что он будет работать ...

2

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

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

Привет, Грэм! Спасибо за помощь! Если я сделаю супер настраиваемое представление, как вы предлагаете, как я могу затем перенаправить события в MKMapView? Есть идеи Martin
0

внедрите

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

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

Привет, Питер, спасибо за ответ! Но я думаю, что при этом MKMapView не сможет получать какие-либо события касания, не так ли? Я ищу способ просто перехватить событие, а затем переслать его в MKMapView. Martin
0

что я собрал, это позволяет увеличивать масштаб в симуляторе (еще не пробовал на реальном iPhone), но я думаю, что все будет в порядке:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Touch Began %d", [touches count]);
 reportTrackingPoints = NO;
 startTrackingPoints = YES;
    [viewTouched touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
 if ([[event allTouches] count] == 2) {
  reportTrackingPoints = YES;
  if (startTrackingPoints == YES) {
   BOOL setA = NO;
   NSEnumerator *enumerator = [[event allTouches] objectEnumerator];
   id value;
   while ((value = [enumerator nextObject])) {
    if (! setA) {
     startPointA = [value locationInView:mapView];
     setA = YES;
    } else {
     startPointB = [value locationInView:mapView];
    }
   }
   startTrackingPoints = NO;
  } else {
   BOOL setA = NO;
   NSEnumerator *enumerator = [[event allTouches] objectEnumerator];
   id value;
   while ((value = [enumerator nextObject])) {
    if (! setA) {
     endPointA = [value locationInView:mapView];
     setA = YES;
    } else {
     endPointB = [value locationInView:mapView];
    }
   }
  }
 }
 //NSLog(@"Touch Moved %d", [[event allTouches] count]);
    [viewTouched touchesMoved:touches withEvent:event];
}

- (void) updateMapFromTrackingPoints {
 float startLenA = (startPointA.x - startPointB.x);
 float startLenB = (startPointA.y - startPointB.y);
 float len1 = sqrt((startLenA * startLenA) + (startLenB * startLenB));
 float endLenA = (endPointA.x - endPointB.x);
 float endLenB = (endPointA.y - endPointB.y);
 float len2 = sqrt((endLenA * endLenA) + (endLenB * endLenB));
 MKCoordinateRegion region = mapView.region;
 region.span.latitudeDelta = region.span.latitudeDelta * len1/len2;
 region.span.longitudeDelta = region.span.longitudeDelta * len1/len2;
 [mapView setRegion:region animated:YES];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
 if (reportTrackingPoints) {
  [self updateMapFromTrackingPoints];
  reportTrackingPoints = NO;
 }


    [viewTouched touchesEnded:touches withEvent:event];
}

Основная идея заключается в том, что если пользователь использует два пальца, вы отслеживаете значения. Я записываю начальную и конечную точки в startPoints A и B. Затем я записываю текущие точки отслеживания, и когда я закончу, на touchesEnded я могу вызвать подпрограмму для вычисления относительной длины линии между точками, с которых я начинаю и линия между точкой I заканчивается с помощью простого вычисления гипотенузы. Соотношение между ними - величина увеличения: я умножаю область на эту сумму.

Надеюсь, это кому-нибудь пригодится.

0

al, и он отлично сработал для того, чего я пытался достичь; быстрое и чистое решение.

Короче, у меня был пользовательский UITableViewCell (разработанный в IB) с MKMapView слева и несколькими UILabels справа. Я хотел сделать пользовательскую ячейку, чтобы вы могли касаться ее где угодно, и это подтолкнуло бы новый контроллер представления. Однако касание карты не передавало касания «вверх» в UITableViewCell, пока я просто не добавил UIView того же размера, что и вид карты, прямо над ним (в IB) и не сделал его фон «чистым цветом» в коде ( не думаю, что вы можете установить clearColor в IB ??):

dummyView.backgroundColor = [UIColor clearColor];

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

«Однако касание карты не передавало касания« вверх »в UITableViewCell, пока я просто не добавил UIView того же размера, что и вид карты, прямо над ним». Это не так. Карта обрабатывает прикосновения, потому что она имеет свои собственные пользовательские взаимодействия, такие как прокрутка и т. Д. Если вы хотите обнаружить хотя бы в ячейке вместо взаимодействия с картой, просто установите map.isUserInteractionEnabled = false. Затем вы можете просто использовать didSelectRowAtIndexPath в таблице просмотр делегата. BROK3N S0UL

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