Het plaatsen van pijl uipopovercontroller op annotatie punt mapkit

stemmen
2

Ik ben op zoek naar een popover te verschijnen op een kaart kit annotatie punt te krijgen, maar kan niet vinden van een rect in de aantekening oog eigenschappen aan de rect methode van bellen uipopovercontroller gebruiken. Als gegeven een aantekening op de kaart kit hoe gaat men op zoek naar de juiste frame?

Om paul meer informatie te geven, hier is mijn poging: Ik heb al gebruikt:

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

En ... Ik krijg een popover in de linkerbovenhoek aan de rand van de MapView.

Kan iemand mij vertellen waarom? Ik probeer te krijgen om te verschijnen in de buurt van de pin / annotationview.

De vraag is gesteld op 04/05/2010 om 07:36
bron van user
In andere talen...                            


5 antwoorden

stemmen
7

Oke,

Hier is wat ik vond als enige work-around tot nu toe:

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

Het slechte deel hiervan is dat ik faken zetten het op het uitzicht op de annotatie. Ik krijg gewoon de annotation.coordinate van de annotatie view (MKMapKit stijl coördinaten) en zet de coördinaten naar coördinaten screenen. Dan maak ik een UILabel (op een frame-capable construct op het scherm te krijgen) geplaatst waar de annotatie View zou zijn. Ik vertel dan is de popovercontroller om te verschijnen op dat frame locatie.

Hier is de kicker. Ik heb niet de UILabel toe te voegen aan de mapView2. Ik laat het gewoon een keer popovercontroller zelf heeft opgesteld.

Hack, maar schoon.

antwoordde op 04/05/2010 om 22:13
bron van user

stemmen
2

Het probleem met het eerste voorbeeld van deze draad is in de aanroep presentPopoverFromRect: InView: permittedArrowDirections: geanimeerd :. De waarde voor de InView: parameter is niet correct. Het moet view.rightCalloutAccessoryView.

Dat wil zeggen, de coördinaten van de rechthoek zijn ten opzichte van rightCalloutAccessoryView.

Met deze wijziging wordt het gedrag vergelijkbaar met de kaarten toepassing die recht lijkt te zijn.

antwoordde op 26/06/2010 om 15:40
bron van user

stemmen
1

Niet gelezen alle antwoorden ... maar ik had een soortgelijk probleem. Ik wilde een popover te laten verschijnen als ik tik op de accessoire-knop in de callout bel. Dit is hoe ik mijn probleem opgelost.

In de eerste plaats, ik centreren de kaart om de annotatie koos ik, waarvan ik denk dat is altijd een goed idee in dit geval. Vervolgens implementeren ik de popover met een vaste grootte en plaats deze op de juiste positie (naar mijn mening).

Hier is een deel van mijn 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];
}
antwoordde op 09/05/2010 om 21:57
bron van user

stemmen
1

Als u het MKAnnotationView, en je zeggen dat je dat doet, dan kunt u te gebruiken frameeigenschap, want het is een UIViewsubklasse.

antwoordde op 04/05/2010 om 08:27
bron van user

stemmen
0

Het probleem met presentPopoverFromRect: InView: permittedArrowDirections: animated is dat als de inhoudsmaat van de popover groter dan past op het scherm (omdat de annotatie dichtbij de de rand van het scherm, bijvoorbeeld), zal het systeem eerst (bij ten dele) negeren de rechthoek, en met de punt van de pijl ergens in het midden van de weergave. Ik heb dit opgelost door dit te doen het op deze manier:

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

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

De rightCalloutAccessoryView is normaal gesproken een detail openbaarmaking knop, met een afmeting van 29 heeft door 31. Dus, wat ik doe, is het creëren van een 29 op 31 rechthoek, die het gehele accessoire uitzicht dekt. Dan presenteer ik de popover van het accessoire uitzicht. Door het verhogen van 29 tot 40, zal de popover pijl buiten het bijschrift bel, maar alleen als er voldoende ruimte is om het gehele bijschrift presenteren op het scherm. Anders zal de pijl binnen de bel worden bewogen. Om een ​​consistente interface behouden ik de breedte 29.

antwoordde op 06/06/2012 om 06:57
bron van user

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