2010-05-04 1 views
2

Я пытаюсь получить popover, чтобы появиться в точке аннотации набора карт, но не могу найти «rect» в свойствах аннотаций, чтобы использовать метод rect для вызова uipopovercontroller. Если задана аннотация на наборе карт, как найти подходящий «кадр»?Размещение стрелки uipopovercontroller в точке аннотации на mapkit

Чтобы дать Полю больше информации, вот моя попытка: Я уже использовал:

- (void)mapView:(MKMapView *)mapView2 annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control{ 
    NSLog(@"annotationView..."); 
    MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager]; 
    int choice = 0; 
    for (NSMutableDictionary *locationDictionary in [myGizmoClass searchResultsForResortLocation]) 
    { 
     if([view.annotation.title isEqualToString:[locationDictionary objectForKey:@"name"]]) 
     { 

      DetailViewTableStyleController *controller = [[DetailViewTableStyleController alloc] initWithlocationData:[[myGizmoClass searchResultsForResortLocation] objectAtIndex:choice] nibName:@"DetailViewTableStyle" bundle:[NSBundle mainBundle]]; 

      controller.categoryCode = [locationDictionary objectForKey:@"category_code"] ; 

      //create a popover controller 
      popoverControllerDetail = [[UIPopoverController alloc] initWithContentViewController:controller]; 

      // set contentsize 
      [popoverControllerDetail setPopoverContentSize:CGSizeMake(320,480)]; 

      //present the popover view non-modal 

      [popoverControllerDetail presentPopoverFromRect:view.rightCalloutAccessoryView.frame inView:mapView2 permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 

      [controller release]; 
      break; 
     } 
     choice = choice + 1; 
    } 
} 

И ... Я получаю пирог в верхнем левом углу на краю MapView.

Может ли кто-нибудь сказать мне, почему? Я пытаюсь заставить его появиться рядом с pin/annotationview.

ответ

7

Хорошо,

Вот что я нашел, как только работа вокруг до сих пор:

CGPoint annotationPoint = [mapView2 convertCoordinate:view.annotation.coordinate toPointToView:mapView2]; 
float boxDY=annotationPoint.y; 
float boxDX=annotationPoint.x; 
CGRect box = CGRectMake(boxDX,boxDY,5,5); 
UILabel *displayLabel = [[UILabel alloc] initWithFrame:box]; 


[popoverControllerDetail presentPopoverFromRect:displayLabel.frame inView:mapView2 permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
[displayLabel release]; 

Плохая часть о том, что я притворялся положить его в связи с аннотацией. Я просто получаю аннотацию. Координаты аннотации (координаты стиля MKMapKit) и преобразуют координаты в координаты экрана. Затем я создаю uilabel (чтобы получить конструкцию на основе кадра на экране), размещенную там, где будет просмотр аннотации. Затем я указываю, что popovercontroller появится в этом месте кадра.

Это кикер. Я не добавляю uilabel к mapView2. Я просто выпускаю его, как только popovercontroller нарисовал себя.

Hack, но чистый.

+5

Вам не нужен UILabel. 'displayLabel.frame' просто возвращает CGRect, поэтому вы можете просто использовать' box' напрямую. –

+0

Проблема с presentPopoverFromRect: inView: allowedArrowDirections: анимированный - это то, что если размер содержимого popover больше, чем то, что подходит на экране (например, –

1

Если у вас есть MKAnnotationView, и вы подразумеваете, что это так, то вы можете использовать его свойство frame, так как это подкласс UIView.

+0

Проверьте новый код, который я добавил, пожалуйста, для получения дополнительной информации Пол. Я благодарю вас за помощь. – Jann

+0

Вы должны распечатать два значения фрейма; Я подозреваю, что вы используете координаты из несовпадающих представлений. Используйте convertRect: toView: чтобы убедиться, что они совпадают. –

1

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

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

Вот часть моего кода:

-(void)mapView:(MKMapView *)theMapView annotationView:(MKAnnotationView *)pin calloutAccessoryControlTapped:(UIControl *)control 
{ 
    UIViewController *detailController = [[detailedPinView alloc] initWithNibName:@"detailedPinView" 
                      bundle:nil 
                    annotationView:pin]; 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    { 

     UIPopoverController* aPopover = [[UIPopoverController alloc] initWithContentViewController:detailController]; 
     [aPopover setDelegate:self]; 
     [aPopover setPopoverContentSize:CGSizeMake(320, 320) animated:YES]; 

     [detailController setPopover:aPopover]; 
     [detailController release]; 

     [mapView deselectAnnotation:pin.annotation animated:YES]; 

     self.popoverController = aPopover; 

     [mapView setCenterCoordinate:pin.annotation.coordinate animated:YES]; 

     [self.popoverController presentPopoverFromRect:CGRectMake(382,498,0,0) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; 
    } 
    else 
    { 
     [self presentModalViewController: detailController animated:YES]; 
    } 


    [detailController release]; 
} 
+0

Я ответил на свой вопрос тем, что, по моему мнению, было немного лучше. координаты mkannotation, я тогда позволяю iPad iPhoneOS по-прежнему принимать самое лучшее решение о том, где должен быть popover. Я думаю, что это будет лучше в большинстве ситуаций (читайте обновления iPhoneOS) .., но спасибо за ваш ответ. – Jann

2

Проблема с первым примером в этой теме находится в вызове presentPopoverFromRect: INview: permittedArrowDirections: анимированные :. Значение параметра inView: неверно. Это должно быть view.rightCalloutAccessoryView.

То есть, координаты прямоугольника относятся к rightCalloutAccessoryView.

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

0

Проблема с presentPopoverFromRect: inView: allowedArrowDirections: анимированный - это то, что если размер содержимого popover больше, чем то, что подходит на экране (потому что аннотация закрыта краем экрана, например), система сначала (по крайней мере частично) игнорирует прямоугольник и помещает кончик стрелки где-нибудь посередине представления.Я решил эту проблему, делая это таким образом:

self.popover = [[UIPopoverController alloc] initWithContentViewController:placeDetailViewController]; 

[self.popover presentPopoverFromRect:CGRectMake(0, 0, 29, 31) inView:view.rightCalloutAccessoryView permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES]; 

rightCalloutAccessoryView обычно кнопка раскрытия детали, которая имеет размер 29 на 31. Так, что я делаю, это создать 29 по 31 прямоугольник, который охватывает весь вид аксессуаров. Затем я представляю popover из вида аксессуаров. Увеличивая значение 29-40, стрелка popover будет находиться вне пузыря выноски, но только в том случае, если на экране будет достаточно места для отображения всей выноски. Если нет, стрелка будет перемещена внутри пузыря. Чтобы поддерживать согласованный интерфейс, я оставил ширину на 29.

Смежные вопросы