Platzieren Pfeil von uipopovercontroller an Anmerkung Punkt auf MapKit

stimmen
2

Ich versuche, eine popover zu erhalten, die eine Karte Kit Anmerkung Punkt erscheint, kann aber eine „rect“ in der Anmerkungsansicht Eigenschaften nicht finde die rect Methode des Aufrufs uipopovercontroller zu verwenden. Wenn eine Anmerkung auf der Karte Kit gegeben, wie man den entsprechenden „Rahmen“ nicht finden?

Gibt paul weitere Informationen, hier ist mein Versuch: Ich habe bereits verwendet:

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

Und ... ich am Rande des mapview eine popover an den oberen linken bekommen.

Kann mir jemand sagen, warum? Ich versuche, es in der Nähe des Stift / AnnotationView erscheinen zu bekommen.

Veröffentlicht am 04/05/2010 um 07:36
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
7

Okay,

Hier ist, was ich als die einzige Behelfslösung bisher gefunden:

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

Das Schlimme daran ist, dass ich es im Hinblick auf die Anmerkung setzen bin fälschen. Ich bekomme einfach die annotation.coordinate der Anmerkungsansicht (MKMapKit Stil-Koordinaten) und wandeln die Koordinaten in Bildschirmkoordinaten. Dann erstelle ich eine UILabel (ein Frame-fähiges Konstrukt auf dem Bildschirm zu bekommen) platziert, wo die Annotation Ansicht wäre. Ich sage dann dem popovercontroller an dieser Rahmenposition angezeigt werden.

Hier ist der Kicker. Ich habe nicht die UILabel zum mapView2 hinzuzufügen. Ich lasse es einfach einmal popovercontroller sich gezogen hat.

Hack, aber sauber.

Beantwortet am 04/05/2010 um 22:13
quelle vom benutzer

stimmen
2

Das Problem bei dem ersten Beispiel in diesem Thread in dem Aufruf von presentPopoverFromRect: INview: permittedArrowDirections: animiert :. Der Wert für den INview: Parameter ist nicht korrekt. Es sollte view.rightCalloutAccessoryView sein.

Das heißt, das Rechteck des Koordinaten relativ zu rightCalloutAccessoryView.

Mit dieser Änderung wird das Verhalten der Karten-Anwendung ähnlich sein, die richtigen zu sein scheint.

Beantwortet am 26/06/2010 um 15:40
quelle vom benutzer

stimmen
1

Haben alle Antworten nicht gelesen ... aber ich hatte ein ähnliches Problem. Ich wollte eine popover Box zeigen, wenn ich die Zubehör-Taste in der Hinweisblase tippen. Dies ist, wie ich mein Problem gelöst.

Zunächst, Zentrieren ich die Karte auf die Anmerkung wählte ich, was ich denke, ist immer eine gute Idee, in diesem Fall. Dann implementieren ich die popover mit einer festen Größe und positioniere sie an der richtigen Stelle (meiner Meinung nach).

Hier ist ein Teil meines Codes:

-(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];
}
Beantwortet am 09/05/2010 um 21:57
quelle vom benutzer

stimmen
1

Wenn Sie das haben MKAnnotationView, und Sie implizieren , dass Sie das tun, dann können Sie seine verwenden frameEigenschaft, als es sich um eine UIViewUnterklasse.

Beantwortet am 04/05/2010 um 08:27
quelle vom benutzer

stimmen
0

Das Problem mit presentPopoverFromRect: INview: permittedArrowDirections: animiert ist, dass, wenn der Inhalt Größe des popover größer als das, was auf dem Bildschirm paßt (weil die Anmerkung den der Rand des Bildschirms, zB in der Nähe ist), wird das System zuerst (bei dest teilweise) außer Acht lassen das Rechteck, und setzen Sie die Spitze des Pfeils irgendwo in der Mitte der Ansicht. Ich habe dieses Problem gelöst, indem es auf diese Weise tun:

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

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

Die rightCalloutAccessoryView ist normalerweise eine Detail Offenlegung Taste, die eine Größe von 29 bis 31 hat also, was ich tue, ist ein 29 bis 31 Rechteck erstellen, die die gesamte Zubehör Ansicht abdeckt. Dann stelle ich die popover aus dem Zubehör Ansicht. Durch die Erhöhung der 29-40, wird der popover Pfeil außerhalb der Hinweisblase sein, aber nur, wenn genügend Platz vorhanden ist die gesamte Legende auf dem Bildschirm zu präsentieren. Wenn nicht, wird der Pfeil in der Blase verschoben werden. Um eine konsistente Schnittstelle zu halten, verließ ich die Breite auf 29.

Beantwortet am 06/06/2012 um 06:57
quelle vom benutzer

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