La colocación de la flecha de uipopovercontroller en el punto de anotación en MapKit

votos
2

Estoy tratando de conseguir un popover a aparecer en un punto de anotación mapa kit, pero no puedo encontrar una rect en las propiedades de la vista de anotación de utilizar el método de llamar rect uipopovercontroller. Si se les da una anotación en el mapa kit ¿cómo encontrar el marco apropiado?

Para dar paul más información, aquí está mi intento: ya he utilizado:

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

Y ... me sale un popover en la parte superior izquierda en el borde de la MapView.

puede alguien decirme por que? Estoy tratando de conseguir que aparece cerca del pin / annotationview.

Publicado el 04/05/2010 a las 07:36
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
7

Bueno,

Aquí es lo que encontré como la única solución temporal hasta el momento:

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

Lo malo de esto es que estoy fingiendo ponerlo en la vista de la anotación. Simplemente da la annotation.coordinate de la vista de anotación (coordenadas estilo MKMapKit) y convertir las coordenadas a coordenadas de pantalla. Entonces creo una UILabel (para obtener una construcción de marco con capacidad en la pantalla) colocado donde sería la anotación Vista. entonces yo digo la popovercontroller a aparecer en ese lugar marco.

Aquí está el truco. No agrego el UILabel a la mapView2. Simplemente suelte una vez popovercontroller ha dibujado a sí mismo.

Hack, pero limpio.

Respondida el 04/05/2010 a las 22:13
fuente por usuario

votos
2

El problema con el primer ejemplo en este hilo es en la llamada a presentPopoverFromRect: inView: permittedArrowDirections: animada :. El valor de la inView: parámetro no es correcto. Debe ser view.rightCalloutAccessoryView.

Es decir, las coordenadas del rectángulo son en relación con rightCalloutAccessoryView.

Con este cambio, el comportamiento será similar a la aplicación de mapas que parece correcto.

Respondida el 26/06/2010 a las 15:40
fuente por usuario

votos
1

No leer todas las respuestas ... pero tuve un problema similar. Quería mostrar un cuadro de popover Al tocar en el accesorio botón de llamada en la burbuja. Así es como he resuelto mi problema.

En primer lugar, me centro del mapa a la anotación que elegí, que creo que es siempre una buena idea en este caso. Entonces implementar el popover con un tamaño fijo y colocarlo en la posición correcta (en mi opinión).

Aquí está una parte de mi código:

-(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];
}
Respondida el 09/05/2010 a las 21:57
fuente por usuario

votos
1

Si usted tiene el MKAnnotationView, y da a entender que lo hace, entonces usted puede utilizar su framepropiedad, ya que es una UIViewsubclase.

Respondida el 04/05/2010 a las 08:27
fuente por usuario

votos
0

El problema con presentPopoverFromRect: INview: permittedArrowDirections: animada es que si el tamaño del contenido de la popover es mayor que lo que se ajusta en la pantalla (porque la anotación está cerca del borde de la pantalla, por ejemplo), el sistema primero (por lo menos parcialmente) desatender el rectángulo, y poner la punta de la flecha en algún lugar en el medio de la vista. He resuelto esto haciendo de esta manera:

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

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

El rightCalloutAccessoryView es normalmente un botón de detalle divulgación, que tiene un tamaño de 29 por 31. Por lo tanto, lo que hago, es crear un rectángulo de 29 por 31, que cubre toda la vista accesorio. A continuación les presento la popover desde el punto de vista de accesorios. Mediante el aumento de la 29 a 40, en la flecha popover estará fuera de la burbuja llamada, pero sólo si hay suficiente espacio para presentar la llamada entera en la pantalla. Si no es así, la flecha se moverá dentro de la burbuja. Para mantener una interfaz consistente, Salí de la anchura en 29.

Respondida el 06/06/2012 a las 06:57
fuente por usuario

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