Plasarea săgeată de uipopovercontroller la punctul de adnotare pe mapkit

voturi
2

Sunt încercarea de a obține un popover să apară într-un punct de adnotare hartă kit, dar nu pot găsi o „RECT“ în proprietățile vederii adnotare pentru a utiliza metoda RECT de asteptare uipopovercontroller. În cazul dat o adnotare pe kit de hartă cum nu o găsi corespunzătoare „cadru“?

Pentru a oferi paul mai multe informații, aici este încercarea mea: am folosit deja:

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

Și ... I a lua o popover în partea din stânga sus, la marginea mapview.

Poate cineva să-mi spui de ce? Încerc să-l să apară în apropiere de pini / annotationview.

Întrebat 04/05/2010 la 07:36
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
7

Bine,

Iată ce am găsit ca singura lucrare-în jurul valorii de până acum:

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

Partea proasta despre acest lucru este că eu sunt prefac inscrie la punctul de vedere al adnotată. I a lua pur și simplu annotation.coordinate a vizualizării adnotare (coordonate stilul MKMapKit) și de a converti coordonatele ecran coordonatele. Apoi am crea un uilabel (pentru a obține un construct-cadru capabil pe ecran) plasat în cazul în care ar fi adnotarea View. Eu atunci spun popovercontroller să apară în acea locație cadru.

Aici este kicker. Nu adăugați uilabel la mapView2. Eu pur și simplu eliberați-o dată popovercontroller a atras în sine.

Hack, dar curat.

Publicat 04/05/2010 la 22:13
sursa de către utilizator

voturi
2

Problema cu primul exemplu în acest thread este în apelul la presentPopoverFromRect: Inview: permittedArrowDirections: animat :. Valoarea pentru Inview: parametrul nu este corect. Ar trebui să fie view.rightCalloutAccessoryView.

Aceasta este, coordonatele dreptunghiului sunt raportate la rightCalloutAccessoryView.

Odată cu această modificare, comportamentul va fi similar cu aplicația Maps care pare dreapta.

Publicat 26/06/2010 la 15:40
sursa de către utilizator

voturi
1

Nu a citit toate răspunsurile ... dar am avut o problemă similară. Am vrut să arate o cutie popover atunci când am apăsați butonul accesoriu în balon înștiințărilor. Acesta este modul în care am rezolvat problema mea.

Mai întâi, am centrați harta adnotărilor am ales, care cred că este întotdeauna o idee bună în acest caz. Apoi am pune în aplicare popover cu o dimensiune fixă ​​și poziționați-l în poziția corectă (în opinia mea).

Aici este o parte din codul meu:

-(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];
}
Publicat 09/05/2010 la 21:57
sursa de către utilizator

voturi
1

Dacă aveți MKAnnotationView, și implică faptul că ai face, atunci puteți folosi de frameproprietate, deoarece este o UIViewsubclasă.

Publicat 04/05/2010 la 08:27
sursa de către utilizator

voturi
0

Problema cu presentPopoverFromRect: Inview: permittedArrowDirections: animat este că, în cazul în care dimensiunea conținutul popover este mai mare decât ceea ce se potrivește pe ecran (pentru că adnotarea este de aproape de marginea ecranului, de exemplu), sistemul va prima (la cel puțin parțial) nu ia în considerare dreptunghiului, și a pus vârful săgeții undeva în mijlocul vizualizării. Am rezolvat acest lucru prin a face acest fel:

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

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

RightCalloutAccessoryView este în mod normal, un buton dezvăluire detaliu, care are o dimensiune de 29 de 31. Deci, ceea ce fac, este să creați un dreptunghi de 29 până la 31, care acoperă întregul ecranul accesoriu. Apoi prezint popover din punctul de vedere accesoriu. Prin creșterea la 29 la 40, săgeata popover va fi în afara bulei înștiințărilor, dar numai în cazul în care nu există spațiu suficient pentru a prezenta întregul pe ecran înștiințarea. Dacă nu, săgeata va fi mutat în interiorul balon. Pentru a menține o interfață consistentă, am lăsat lățimea la 29.

Publicat 06/06/2012 la 06:57
sursa de către utilizator

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