Plassering pil uipopovercontroller på merknad punkt på mapkit

stemmer
2

Jeg prøver å få en popover å vises på et kart kit merknad punkt, men kan ikke finne en rect i merknaden visningsegenskaper til å bruke rect metode for å ringe uipopovercontroller. Hvis gitt en merknad på kartet kit hvordan gjør man finne passende ramme?

For å gi paul mer informasjon, her er mitt forsøk: Jeg har allerede brukt:

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

Og ... jeg får en popover øverst til venstre på kanten av mapview.

Kan noen fortelle meg hvorfor? Jeg prøver å få det til å vises nær pin / annotationview.

Publisert på 04/05/2010 klokken 06:36
kilden bruker
På andre språk...                            


5 svar

stemmer
7

Greit,

Her er hva jeg fant som den eneste work-around så langt:

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

Den dårlige delen om dette er at jeg later å sette den på visning av merknader. Jeg bare får annotation.coordinate av merknaden view (MKMapKit stil koordinater) og konvertere koordinatene til skjermen koordinater. Deretter oppretter I en UILabel (for å få en ramme-konstruksjon i stand til på skjermen) som er plassert der merknad Se ville være. Jeg så fortelle popovercontroller å se på den rammen sted.

Her er kicker. Jeg kan ikke legge til UILabel til mapView2. Jeg bare slipper det en gang popovercontroller har trukket seg.

Hack, men rent.

Svarte 04/05/2010 kl. 21:13
kilden bruker

stemmer
2

Problemet med det første eksempel på denne tråden er i kallet til presentPopoverFromRect: Inview: permittedArrowDirections: animerte :. Verdien for den Inview: parameteren er ikke riktig. Det bør være view.rightCalloutAccessoryView.

Det vil si at rektangel koordinater står i forhold til rightCalloutAccessoryView.

Med denne endringen, vil atferden være lik kartene program som virker riktig.

Svarte 26/06/2010 kl. 14:40
kilden bruker

stemmer
1

Har ikke lest alle svarene ... men jeg hadde et lignende problem. Jeg ønsket å vise en popover boksen når jeg trykker på tilbehøret knappen i bildeforklaring boble. Dette er hvordan jeg løste mitt problem.

Først av, jeg sentrere kartet til merknaden jeg valgte, som jeg tror er alltid en god ide i dette tilfellet. Da jeg gjennomføre popover med en fast størrelse og plassere den i riktig posisjon (etter min mening).

Her er en del av min kode:

-(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];
}
Svarte 09/05/2010 kl. 20:57
kilden bruker

stemmer
1

Hvis du har MKAnnotationView, og du antyder at du gjør det, så kan du bruke sin frameeiendom, som det er en UIViewunderklasse.

Svarte 04/05/2010 kl. 07:27
kilden bruker

stemmer
0

Problemet med presentPopoverFromRect: Inview: permittedArrowDirections: animerte er at hvis innholdet størrelsen på popover er større enn hva som passer på skjermen (fordi merknaden er nær den kanten av skjermen, for eksempel), vil systemet først (på i det minste delvis) bort fra rektangel, og sette spissen av pilen sted i midten av visningen. Jeg har løst dette ved å gjøre det på denne måten:

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

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

Den rightCalloutAccessoryView er normalt en detalj avsløring knapp, som har en størrelse på 29 av 31. Så, hva jeg gjør, er å lage en 29 med 31 rektangel, som dekker hele tilbehøret visning. Så jeg presentere den popover fra tilbehøret visningen. Ved å øke de 29 til 40, vil den popover pilen være utenfor forklaringen boblen, men bare hvis det er nok plass til å presentere hele bildeforklaringen på skjermen. Hvis ikke, vil pilen flyttes inne i boblen. For å opprettholde et konsistent grensesnitt, jeg forlot bredde på 29.

Svarte 06/06/2012 kl. 05:57
kilden bruker

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