Размещение стрелка uipopovercontroller в точке аннотаций на MapKit

голоса
2

Я пытаюсь получить поповер появиться в точке аннотаций карты набора, но не могу найти «прямоугольник» в свойствах пояснительного использовать метод прямоугольника вызова 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;
    }
}

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

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

Задан 04/05/2010 в 07:36
источник пользователем
На других языках...                            


5 ответов

голоса
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];

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

Вот кикер. Я не добавить UILabel к mapView2. Я просто отпустить его раз popovercontroller нарисовал себя.

Hack, но чистый.

Ответил 04/05/2010 в 22:13
источник пользователем

голоса
2

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

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

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

Ответил 26/06/2010 в 15:40
источник пользователем

голоса
1

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

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

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

-(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];
}
Ответил 09/05/2010 в 21:57
источник пользователем

голоса
1

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

Ответил 04/05/2010 в 08:27
источник пользователем

голоса
0

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

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.

Ответил 06/06/2012 в 06:57
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more