iPad и MapKit: не удается перетащить маркер, который можно перетаскивать

Я немного злюсь.

Насколько я знаю, я все делаю правильно.

Я делаю то, что написано в этой публикации, но не играю в кости.

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

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

Вот его интерфейс:

/**************************************************************//**
 \class BMLT_Search_BlackAnnotationView
 \brief We modify the black annotation view to allow dragging.
 *****************************************************************/
@interface BMLT_Search_BlackAnnotationView : BMLT_Results_BlackAnnotationView

@property (nonatomic,readwrite,assign) CLLocationCoordinate2D   coordinate;

- (id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier coordinate:(CLLocationCoordinate2D)inCoordinate;
@end

И вот его реализация:

/**************************************************************//**
 \class BMLT_Search_BlackAnnotationView
 \brief We modify the black annotation view to allow dragging.
 *****************************************************************/
@implementation BMLT_Search_BlackAnnotationView
@synthesize coordinate;

/**************************************************************//**
 \brief We simply switch on the draggable bit, here.
 \returns self
 *****************************************************************/
- (id)initWithAnnotation:(id<MKAnnotation>)annotation
         reuseIdentifier:(NSString *)reuseIdentifier
              coordinate:(CLLocationCoordinate2D)inCoordinate
{
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];

    if ( self )
        {
        [self setDraggable:YES];
        [self setCoordinate:inCoordinate];
        }

    return self;
}

/**************************************************************//**
 \brief Handles dragging.
 *****************************************************************/
- (void)setDragState:(MKAnnotationViewDragState)newDragState
            animated:(BOOL)animated
{
#ifdef DEBUG
    NSLog(@"BMLT_Search_BlackAnnotationView setDragState called with a drag state of %@.", newDragState);
#endif
    self.dragState = newDragState;
}

@end

setDragState: анимированный: никогда не вызывается.

Насколько я знаю, я все делаю правильно.

Очевидно, что нет.

Любые идеи?

Вот настройка и обратный вызов:

/**************************************************************//**
 \brief  If this is an iPad, we'll set up the map.
 *****************************************************************/
- (void)setUpMap
{
    if ( mapSearchView )    // This will be set in the storyboard.
        {
#ifdef DEBUG
        NSLog(@"A_BMLT_SearchViewController setUpIpadMap called (We're an iPad, baby!).");
#endif
        BMLTAppDelegate *myAppDelegate = [BMLTAppDelegate getBMLTAppDelegate];  // Get the app delegate SINGLETON

        CLLocationCoordinate2D  center;
#ifdef DEBUG
        NSLog(@"A_BMLT_SearchViewController setUpIpadMap We're using the canned coordinates.");
#endif
        center.latitude = [NSLocalizedString(@"INITIAL-MAP-LAT", nil) doubleValue];
        center.longitude = [NSLocalizedString(@"INITIAL-MAP-LONG", nil) doubleValue];

        if ( [myAppDelegate myLocation] )
            {
#ifdef DEBUG
            NSLog(@"A_BMLT_SearchViewController setUpIpadMap We know where we are, so we'll set the map to that.");
#endif
            center = [myAppDelegate myLocation].coordinate;
            }

        MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(center, 25000, 25000);

        [mapSearchView setRegion:region animated:NO];

        BMLT_Results_MapPointAnnotation *myMarker = [[BMLT_Results_MapPointAnnotation alloc] initWithCoordinate:center andMeetings:nil];

        [myMarker setTitle:@"Marker"];

        [mapSearchView addAnnotation:myMarker];

        if ( [[BMLT_Prefs getBMLT_Prefs] keepUpdatingLocation] )    // If the user wants us to keep track of them, then we'll do so.
            {
            [mapSearchView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
            }
        else
            {
            [mapSearchView setUserTrackingMode:MKUserTrackingModeNone animated:NO];
            }
        }
}

#pragma mark - MkMapAnnotationDelegate Functions -

/**************************************************************//**
 \brief Returns the view for the marker in the center of the map.
 \returns an annotation view, representing the marker.
 *****************************************************************/
- (MKAnnotationView *)mapView:(MKMapView *)mapView
            viewForAnnotation:(id < MKAnnotation >)annotation
{
#ifdef DEBUG
    NSLog(@"A_BMLT_SearchViewController viewForAnnotation called.");
#endif
    static NSString* identifier = @"single_meeting_annotation";

    MKAnnotationView* ret = [mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

    if ( !ret )
        {
        ret = [[BMLT_Search_BlackAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier coordinate:[annotation coordinate]];
        }

    return ret;
}

person Chris Marshall    schedule 30.03.2012    source источник


Ответы (2)


Вам нужно сделать так, чтобы ваш вид anootation можно было перетаскивать.

[ret setDraggable:YES]
person Cyril Godefroy    schedule 30.03.2012
comment
Спасибо. Это делается в реальном классе представления. Тем не менее, я думаю, что знаю, в чем проблема. Похоже, что область проверки попадания для маркера — это булавка по умолчанию, а не моя новая иконка, которая шире. Если я щелкну прямо внутри того места, где должна быть булавка, я смогу перетащить. - person Chris Marshall; 30.03.2012
comment
На самом деле, я думаю, что это проблема, которую усугубляет симулятор. Я использую трекпад и точный указатель. Если я приколю изображение ровно по центру, то смогу перетащить. Вокруг нее есть несколько пикселей, которые ничего не делают, затем фоновая карта. Я подозреваю, что использование моей лапы, похожей на окорок, в реальном устройстве будет работать каждый раз. Я опубликую ответ, когда SO позволит это. - person Chris Marshall; 30.03.2012

Просто хотел сообщить о НАСТОЯЩЕЙ проблеме здесь:

ПЕБКАК

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

На аппарате лучше, пальцем, хотя и тот тоже дергается.

Кстати: код для карты на данный момент отличается от приведенного выше. Я исправил несколько других проблем.

Если кто-то хочет увидеть код, весь проект с открытым исходным кодом (GitHub — посмотрите BMLT IOS< /а>). В настоящее время я работаю в ветке 2.0 и буду работать какое-то время, так что это движущаяся цель.

person Chris Marshall    schedule 01.04.2012