Placer la flèche de uipopovercontroller au point d'annotation sur MapKit

voix
2

Je suis en train d'obtenir un popover apparaître à un point d'annotation de kit de carte, mais ne trouve pas « rect » dans les propriétés de la vue d'annotation d'utiliser la méthode rect d'appeler uipopovercontroller. Si on leur donne une annotation sur le kit de carte comment peut-on trouver le « cadre » approprié?

Pour donner paul plus d'informations, voici ma tentative: Je l'ai déjà utilisé:

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

Et ... je reçois un popover en haut à gauche au bord de la MapView.

Quelqu'un peut-il me dire pourquoi? Je suis en train de le faire à apparaître près de la broche / annotationview.

Créé 04/05/2010 à 07:36
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
7

D'accord,

Voici ce que je trouve que le seul travail autour jusqu'à présent:

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 mauvaise partie à ce sujet est que je fais semblant de le mettre à la vue de l'annotation. Je reçois tout simplement le annotation.coordinate de la vue d'annotation (coordonnées de style MKMapKit) et convertir les coordonnées en coordonnées écran. Puis-je créer un UILabel (pour obtenir une construction de cadre capable à l'écran) placé où la vue Annotation serait. Je dis alors le popovercontroller apparaître à cet endroit du cadre.

Voici le kicker. Je ne fais pas le UILabel au mapView2. Je libère simplement une fois popovercontroller lui-même a dessiné.

Hack, mais propre.

Créé 04/05/2010 à 22:13
source utilisateur

voix
2

Le problème avec le premier exemple dans ce fil est dans l'appel à presentPopoverFromRect: inView: permittedArrowDirections: animation :. La valeur du inView: paramètre est incorrect. Il devrait être view.rightCalloutAccessoryView.

Autrement dit, les coordonnées du rectangle sont par rapport à rightCalloutAccessoryView.

Avec ce changement, le comportement sera similaire à l'application de cartes qui semble juste.

Créé 26/06/2010 à 15:40
source utilisateur

voix
1

N'a pas lu toutes les réponses ... mais j'eu un problème similaire. Je voulais montrer une boîte de popover quand je tape sur le bouton accessoire dans la bulle callout. Voilà comment je résolu mon problème.

D'abord, je centrer la carte à l'annotation j'ai choisi, ce qui je pense est toujours une bonne idée dans ce cas. Ensuite, je Mettre en oeuvre le popover avec une taille fixe et le positionner à la bonne position (à mon avis).

Voici une partie de mon code:

-(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];
}
Créé 09/05/2010 à 21:57
source utilisateur

voix
1

Si vous avez le MKAnnotationView, et vous laissez entendre que vous faites, vous pouvez utiliser sa framepropriété, car elle est une UIViewsous - classe.

Créé 04/05/2010 à 08:27
source utilisateur

voix
0

Le problème avec presentPopoverFromRect: inView: permittedArrowDirections: animation est que si la taille du contenu du popover est supérieure à ce qui convient à l'écran (car l'annotation est proche du bord de l'écran, par exemple), le système sera d'abord (à moins en partie) ne pas tenir compte du rectangle, et de mettre la pointe de la flèche quelque part au milieu de la vue. Je l'ai résolu ce problème en faisant de cette façon:

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

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

Le rightCalloutAccessoryView est normalement un bouton d'information de détail, ce qui a une taille de 29 par 31. Donc, ce que je fais, est de créer un 29 par 31 rectangle, qui couvre toute la vue accessoire. Ensuite, je vous présente la popover de la vue accessoire. En augmentant le 29 à 40, la flèche popover sera en dehors de la bulle callout, mais seulement s'il y a assez d'espace pour présenter l'ensemble à l'écran callout. Dans le cas contraire, la flèche sera déplacé à l'intérieur de la bulle. Pour maintenir une interface cohérente, je suis parti de la largeur à 29.

Créé 06/06/2012 à 06:57
source utilisateur

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