Posizionamento freccia del uipopovercontroller al punto di annotazione sulla MapKit

voti
2

Sto cercando di ottenere un popover a comparire in un punto di annotazione mappa kit, ma non riesco a trovare un rect nelle proprietà vista annotazione di utilizzare il metodo di chiamare rect uipopovercontroller. Se dato un'annotazione sulla mappa kit come si fa a trovare il frame appropriato?

Per dare paul maggiori informazioni, ecco il mio tentativo: ho già utilizzato:

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

E ... ho un popover in alto a sinistra sul bordo della mapview.

Qualcuno può dirmi perché? Sto cercando di farlo apparire vicino al pin / annotationview.

È pubblicato 04/05/2010 alle 07:36
fonte dall'utente
In altre lingue...                            


5 risposte

voti
7

Va bene,

Ecco cosa ho trovato come unico work-around finora:

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

La parte cattiva di questo è che sto fingendo di metterlo alla vista l'annotazione. Ho semplicemente ottenere l'annotation.coordinate della vista annotazione (coordinate stile MKMapKit) e convertire le coordinate di schermo coordinate. Poi creo un UILabel (per ottenere un costrutto frame-capace sullo schermo) posto dove l'annotazione vista sarebbe. Ho poi dico la popovercontroller di apparire in quella posizione fotogramma.

Ecco il kicker. Non aggiungo l'UILabel al mapView2. Ho semplicemente rilasciare una volta popovercontroller si è disegnato.

Hack, ma pulito.

Risposto il 04/05/2010 a 22:13
fonte dall'utente

voti
2

Il problema con il primo esempio di questo filo è nella chiamata a presentPopoverFromRect: INview: permittedArrowDirections: animato :. Il valore per l'INview: parametro non è corretto. Dovrebbe essere view.rightCalloutAccessoryView.

Cioè, le coordinate del rettangolo sono relative al rightCalloutAccessoryView.

Con questa modifica, il comportamento sarà simile a l'applicazione Mappe che sembra giusto.

Risposto il 26/06/2010 a 15:40
fonte dall'utente

voti
1

Non ha letto tutte le risposte ... ma ho avuto un problema simile. Volevo mostrare una scatola popover Quando si tocca il tasto accessorio bolla didascalia. Ecco come ho risolto il mio problema.

In primo luogo, ho centrare la mappa per l'annotazione che ho scelto, che credo sia sempre una buona idea in questo caso. Poi a implementare la popover con una dimensione fissa e posizionarlo nella posizione corretta (a mio parere).

Ecco una parte del mio codice:

-(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];
}
Risposto il 09/05/2010 a 21:57
fonte dall'utente

voti
1

Se avete la MKAnnotationView, e si implica che si fa, quindi è possibile utilizzare la sua frameproprietà, in quanto è una UIViewsottoclasse.

Risposto il 04/05/2010 a 08:27
fonte dall'utente

voti
0

Il problema con presentPopoverFromRect: INview: permittedArrowDirections: animato è che se la dimensione contenuto del popover è maggiore di quello che si adatta sullo schermo (perché l'annotazione è vicino al bordo dello schermo, per esempio), il sistema prima (A almeno parzialmente) ignorare il rettangolo, e mettere la punta della freccia qualche parte nel mezzo della vista. Ho risolto il problema facendo in questo modo:

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

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

Il rightCalloutAccessoryView è normalmente un pulsante dettaglio divulgazione, che ha una dimensione di 29 da 31. Quindi, quello che faccio, è creare un 29 da 31 rettangolo, che copre l'intera vista accessorio. Poi presento la popover dalla vista accessorio. Aumentando il 29-40, la freccia popover sarà al di fuori della bolla didascalia, ma solo se non v'è spazio sufficiente per presentare l'intera didascalia sullo schermo. In caso contrario, la freccia sarà spostato all'interno della bolla. Per mantenere un'interfaccia coerente, ho lasciato la larghezza a 29.

Risposto il 06/06/2012 a 06:57
fonte dall'utente

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