Umieszczenie strzałkę uipopovercontroller w punkcie adnotacji na mapkit

głosy
2

Próbuję dostać popover zaistnieć na mapie zestaw punktu adnotacji, ale nie może znaleźć „rect” we właściwościach widoku opisu sposobu korzystania z rect wywołania uipopovercontroller. Jeśli dana adnotację na mapie zestawu jaki sposób znaleźć odpowiedni „Ramka”?

Aby dać Paulowi więcej informacji, tu jest moja próba: Ja już używany:

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

I ... ja dostaję popover w lewym górnym rogu na skraju MapView.

Czy ktoś może mi powiedzieć dlaczego. Próbuję zmusić go do stawienia się w pobliżu pin / annotationview.

Utwórz 04/05/2010 o 07:36
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
7

W porządku,

Oto co znalazłem jako jedyny obejście tej pory:

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

Złe strony o tym, że ja udaje wprowadzenie go w widoku adnotacji. I po prostu uzyskać annotation.coordinate widoku adnotacji (współrzędne styl MKMapKit) i konwersja współrzędnych na współrzędne ekranu. Następnie tworzę UILabel (aby uzyskać konstrukt zdolny ramki na ekranie) umieszczonego gdzie Adnotacja Zobacz będzie. I wtedy powiedzieć popovercontroller pojawiać się w tym miejscu ramki.

Oto kicker. Nie dodać UILabel do mapView2. Po prostu zwolnij go raz popovercontroller wydała się.

Hack, ale czyste.

Odpowiedział 04/05/2010 o 22:13
źródło użytkownik

głosy
2

Problem z tym pierwszym przykładzie w gwint jest wywołanie do presentPopoverFromRect: INview: permittedArrowDirections: animowane :. Wartość dla INview: parametr nie jest prawidłowy. Powinno być view.rightCalloutAccessoryView.

Oznacza to, że współrzędne prostokąta są względem rightCalloutAccessoryView.

Dzięki tej zmianie, zachowanie będzie podobny do aplikacji Mapy który wydaje prawo.

Odpowiedział 26/06/2010 o 15:40
źródło użytkownik

głosy
1

Nie przeczytać wszystkie odpowiedzi ... ale miałem podobny problem. Chciałem pokazać okno popover kiedy dotknąć przycisku akcesoriów w bańce objaśnienia. W ten sposób mogę rozwiązać mój problem.

Po pierwsze, ja wyśrodkować mapę do adnotacji wybrałem, który moim zdaniem jest zawsze dobry pomysł w tym przypadku. Potem wdrożyć popover o stałej wielkości i umieść go w odpowiednim położeniu (moim zdaniem).

Tutaj jest częścią mojego kodu:

-(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];
}
Odpowiedział 09/05/2010 o 21:57
źródło użytkownik

głosy
1

Jeśli masz MKAnnotationView, i sugerują, że to zrobisz, możesz użyć swojego framemienia, jak to jest UIViewpodklasą.

Odpowiedział 04/05/2010 o 08:27
źródło użytkownik

głosy
0

Problem z presentPopoverFromRect: INview: permittedArrowDirections: animowane jest, że jeśli zawartość wielkość popover jest większa niż to, co mieści się na ekranie (bo adnotacja jest zamknąć krawędź ekranu, na przykład), system najpierw (w przynajmniej częściowo) lekceważyć prostokąt i umieścić końcówkę strzałki gdzieś w środku widoku. I został rozwiązany to robiąc to w ten sposób:

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

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

RightCalloutAccessoryView normalnie jest ujawnienie szczegółów przycisk, który ma rozmiar 29 przez 31. Więc, co zrobić, to stworzyć 29 przez 31 prostokąt, który obejmuje całą widok akcesorium. Następnie przedstawiam popover z widoku akcesoriów. Poprzez zwiększenie od 29 do 40, strzałka popover będzie poza bańki objaśnienia, ale tylko jeśli jest wystarczająco dużo miejsca, aby przedstawić całą objaśnienie na ekranie. Jeśli nie, to strzałka zostaną przeniesione wewnątrz bańki. Aby utrzymać spójny interfejs, wyjechałem na 29 szerokości.

Odpowiedział 06/06/2012 o 06:57
źródło użytkownik

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