Размещение стрелки контроллера uipopover в точке аннотации на карте - PullRequest
2 голосов
/ 04 мая 2010

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

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

- (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;
    }
}

И ... я получаю поповер в верхнем левом углу экрана.

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

Ответы [ 5 ]

7 голосов
/ 05 мая 2010

Хорошо,

Вот что я нашел пока единственным обходным путем:

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];

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

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

Взломать, но чисто.

2 голосов
/ 26 июня 2010

Проблема с первым примером в этом потоке заключается в вызове presentPopoverFromRect: inView: разрешеноArrowDirections: animated :. Значение параметра inView: неверно. Это должен быть view.rightCalloutAccessoryView.

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

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

1 голос
/ 10 мая 2010

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

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

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

-(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];
}
1 голос
/ 04 мая 2010

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

0 голосов
/ 06 июня 2012

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

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, который охватывает весь вспомогательный вид. Затем я представляю поповер из вспомогательного вида. При увеличении 29 до 40 стрелка всплывающего окна будет находиться за пределами всплывающей подсказки, но только в том случае, если на экране будет достаточно места для представления всей выноски. Если нет, стрелка будет перемещаться внутри пузыря. Чтобы поддерживать согласованный интерфейс, я оставил ширину в 29 *. 1004 *

...