2014-05-05 7 views
0

Я хочу реализовать пользовательский вид выноски для iOS, который показывает на правой стороне штыря, который получает постукивание. То, как я закончил, похоже на то, как this учебник.
В основном я добавляю subview к представлению аннотации в mapView: didSelectAnnotationView: обратный вызов делегата (второй аргумент представляет собой аннотацию). Он показывает, как мне бы хотелось, НО он не может получать события касания. Я понял, что это (, вероятно,), потому что UIView, который я добавляю, выходит из фрейма представления аннотации, если я нажимаю край, который все еще находится в кадре, он распознается, но больше нигде. Я еще не нашел другого способа сделать что-то, кроме этого, и я не знаю, как заставить прикосновение работать повсюду в UIView.
Я попытался сделать рамку аннотации более крупным, но она также делает вывод (изображение) больше, и это не путь.

Любые идеи?iOS MapKit пользовательская выноска на стороне штыря

ответ

0

Не добавляйте подзаголовок аннотации, а не подкласс MKAnnotationView и реализуйте необходимые методы. Если вам нужен полный контроль над рисунком, просто переопределите -drawRect:. Помните, что MKAnnotationView - это особый класс, который немного похож на UITableViewCell на то, что он имеет специальную обработку для того, чтобы быть поставленным в очередь и отложенным, и вы должны использовать его напрямую. Вот пример, чтобы начать работу.

- (id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     [self commonInit]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     [self commonInit]; 
    } 
    return self; 
} 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self commonInit]; 
    } 
    return self; 

} 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     [self commonInit]; 
    } 
    return self; 
} 

- (void)commonInit 
{ 
    self.frame = CGRectMake(0, 0, 40, 40); 
    self.backgroundColor = [UIColor clearColor]; 
    self.canShowCallout = YES; 
} 

- (void)drawRect:(CGRect)rect 
{ 
    //// Oval Drawing 
    CGRect imageBox = CGRectMake(5, 5, 25, 25); 
    UIBezierPath* ovalPath = [UIBezierPath bezierPathWithOvalInRect:imageBox]; 
    [[UIColor clouds] setFill]; 
    [ovalPath fill]; 
    [[UIColor clouds] setStroke]; 
    ovalPath.lineWidth = 6; 
    [ovalPath stroke]; 

    CGFloat radius = imageBox.size.width/2; 
    UIImage *img = [UIView rasterizedStatusImageForCheckpoint:self.checkpoint withSize:imageBox.size]; 
    img = [img makeRoundedImage:img radius:radius]; 
    [img drawInRect:imageBox]; 
} 
Смежные вопросы