Hogyan szabni a kiemelő buborék MKAnnotationView?

szavazat
87

Én jelenleg is dolgozik a mapkit és am ragadt.

Van egy egyedi feliratozást nézet Én használ, és azt szeretné használni a kép tulajdonság, hogy megjelenjen a pontot a térképen a saját ikont. Van ez jól működik. De mi azt is szeretnék csinálni, hogy felülbírálja az alapértelmezett kiemelő nézet (a buborékban megjelenik a cím / felirat, ha a kommentár ikon megérintésével). Azt akarom, hogy képes legyen irányítani a kiemelő önmagát: a mapkit csupán hozzáférést biztosít a bal és a jobb kiegészítő kiemelő nézeteit, de nem lehet, hogy egy egyéni nézet a kiemelő buborék, vagy, hogy ez nulla méret, vagy bármi más.

Az én ötletem volt, hogy felülbírálja selectAnnotation / deselectAnnotation én MKMapViewDelegate, majd felhívni a saját egyéni nézet, hogy egy hívás a custom kommentár kilátás. Ez működik, de csak akkor, ha canShowCalloutbe van állítva, hogy YESaz én egyéni kommentár nézet osztályban. Ezek a módszerek nem hívják segítségül, ha én ezt a készletet NO(ami az, amit akarok, úgy, hogy az alapértelmezett kiemelő buborék nem húzott). Szóval van nem lehet tudni, ha a felhasználó megérintette a lényeg a térképen (kiválasztva), vagy megérintett egy pont, ami nem része a kommentár nézetek (delected it) anélkül, hogy az alapértelmezett kiemelő buborék nézet fel.

Próbáltam lement egy másik utat, és csak a kezelés minden érintési eseményeket magam a térképen, és nem úgy tűnik, hogy ezt a munkát. Olvastam más kapcsolódó bejegyzések fogása érintés események a térképen, de nem pontosan mit akarok. Van egy módja annak, hogy beleveti magát a térképrészletet, hogy távolítsa el a kiemelő buborék elkészítése előtt? Én a veszteség.

Valami javaslat? Én hiányzó valami nyilvánvaló?

A kérdést 14/10/2009 13:02
a forrás felhasználó
Más nyelveken...                            


9 válasz

szavazat
53

Van egy sokkal egyszerűbb megoldás.

Hozzon létre egy egyéni UIView(a kiemelő).

Ezután hozzon létre egy alosztálya MKAnnotationViewés felülírás setSelectedaz alábbiak szerint:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    if(selected)
    {
        //Add your custom view to self...
    }
    else
    {
        //Remove your custom view...
    }
}

Boom, munkát.

Válaszolt 05/08/2011 12:16
a forrás felhasználó

szavazat
40

detailCalloutAccessoryView

A régi időkben ez volt a fájdalom, de az Apple oldotta meg, csak ellenőrzi a docs on MKAnnotationView

view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
view.canShowCallout = true
view.detailCalloutAccessoryView = UIImageView(image: UIImage(named: "zebra"))

Valóban, ez az. Megtegye UIView.

Válaszolt 23/07/2012 13:44
a forrás felhasználó

szavazat
13

Folytatva a @ TappCandy a zseniálisan egyszerű válasz, ha azt szeretné, hogy animálni a buborék ugyanúgy, mint az alapértelmezett, amit készített animáció módszer:

- (void)animateIn
{   
    float myBubbleWidth = 247;
    float myBubbleHeight = 59;

    calloutView.frame = CGRectMake(-myBubbleWidth*0.005+8, -myBubbleHeight*0.01-2, myBubbleWidth*0.01, myBubbleHeight*0.01);
    [self addSubview:calloutView];

    [UIView animateWithDuration:0.12 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^(void) {
        calloutView.frame = CGRectMake(-myBubbleWidth*0.55+8, -myBubbleHeight*1.1-2, myBubbleWidth*1.1, myBubbleHeight*1.1);
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:0.1 animations:^(void) {
            calloutView.frame = CGRectMake(-myBubbleWidth*0.475+8, -myBubbleHeight*0.95-2, myBubbleWidth*0.95, myBubbleHeight*0.95);
        } completion:^(BOOL finished) {
            [UIView animateWithDuration:0.075 animations:^(void) {
                calloutView.frame = CGRectMake(-round(myBubbleWidth/2-8), -myBubbleHeight-2, myBubbleWidth, myBubbleHeight);
            }];
        }];
    }];
}

Úgy néz ki, meglehetősen bonyolult, de amíg a pont a felirat buborék úgy tervezték, hogy középen alul, akkor csak képes helyettesíteni myBubbleWidth, és myBubbleHeighta saját méretét, hogy működjön. És ne feledd, hogy győződjön meg arról, hogy subviews a autoResizeMasktulajdonság értéke 63 (azaz a „minden”), úgy, hogy megfelelő-e az animáció.

: -Joe

Válaszolt 24/10/2011 13:41
a forrás felhasználó

szavazat
8

Találtam, hogy ez a legjobb megoldás számomra. Akkor kell használni egy kis kreativitás, hogy nem a saját testreszabott

Az Ön MKAnnotationViewalosztály, akkor

- (void)didAddSubview:(UIView *)subview{
    int image = 0;
    int labelcount = 0;
    if ([[[subview class] description] isEqualToString:@"UICalloutView"]) {
        for (UIView *subsubView in subview.subviews) {
            if ([subsubView class] == [UIImageView class]) {
                UIImageView *imageView = ((UIImageView *)subsubView);
                switch (image) {
                    case 0:
                        [imageView setImage:[UIImage imageNamed:@"map_left"]];
                        break;
                    case 1:
                        [imageView setImage:[UIImage imageNamed:@"map_right"]];
                        break;
                    case 3:
                        [imageView setImage:[UIImage imageNamed:@"map_arrow"]];
                        break;
                    default:
                        [imageView setImage:[UIImage imageNamed:@"map_mid"]];
                        break;
                }
                image++;
            }else if ([subsubView class] == [UILabel class]) {
                UILabel *labelView = ((UILabel *)subsubView);
                switch (labelcount) {
                    case 0:
                        labelView.textColor = [UIColor blackColor];
                        break;
                    case 1:
                        labelView.textColor = [UIColor lightGrayColor];
                        break;

                    default:
                        break;
                }
                labelView.shadowOffset = CGSizeMake(0, 0);
                [labelView sizeToFit];
                labelcount++;
            }
        }
    }
}

És ha a subviewegy UICalloutView, akkor csavar körül, és mi van benne azt.

Válaszolt 31/08/2011 21:36
a forrás felhasználó

szavazat
6

Ugyanez volt a probléma. Komoly blogbejegyzések a témáról ebben a blogban http://spitzkoff.com/craig/?p=81 .

Csak az MKMapViewDelegatenem segít itt öröklõdés MKMapViewés megpróbálja kiterjeszteni a meglévő funkciók is, nem működik nekem.

Amit végül csinál, hogy megteremtse a saját CustomCalloutView, hogy én, amelynek a tetején én MKMapView. Akkor stílus ez a nézet bármilyen módon szeretne.

Saját CustomCalloutViewterületén eljárás egy ehhez hasonló:


- (void) openForAnnotation: (id)anAnnotation
{
    self.annotation = anAnnotation;
    // remove from view
    [self removeFromSuperview];

    titleLabel.text = self.annotation.title;

    [self updateSubviews];
    [self updateSpeechBubble];

    [self.mapView addSubview: self];
}

Beletelik egy MKAnnotationobjektumot, és beállítja a saját címét, utána meghívja két másik módszer, amelyek meglehetősen csúnya amely módosíthatja a szélesség és méret a kiemelő tartalmát, és utána felhívni a beszéd buborék körül a megfelelő helyzetben.

Végül a nézetet adunk a subview a mapView. A probléma ezzel az a megoldás, hogy nehéz tartani a kiemelő a megfelelő helyzetben, amikor a térkép nézet görgetni. Én csak bujkál feliratot a térkép nézetek küldött módszert a régió változás, hogy megoldja ezt a problémát.

Eltartott egy ideig, hogy megoldja ezeket a problémákat minden, de most a kiemelő majdnem úgy viselkedik, mint a hivatalos, de megvan a saját stílusa.

Válaszolt 16/10/2009 11:35
a forrás felhasználó

szavazat
5

Alapvetően, hogy megoldja ezt, az egyik kell: a) megakadályozzák az alapértelmezett kiemelő buborék jön. b) ábra, mely annotáció kattintottak.

Tudtam, hogy elérjék ezeket elő: a) beállítás canShowCallout NO b) öröklõdés, MKPinAnnotationView és felülírva az touchesBegan és touchesEnd módszerekkel.

Megjegyzés: Be kell kezelni a kapcsolatot eseményeket a MKAnnotationView és nem MKMapView

Válaszolt 20/11/2009 12:22
a forrás felhasználó

szavazat
3

Csak jön a megközelítés, a gondolat itt

  // Detect the touch point of the AnnotationView ( i mean the red or green pin )
  // Based on that draw a UIView and add it to subview.
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    CGPoint newPoint = [self.mapView convertCoordinate:selectedCoordinate toPointToView:self.view];
//    NSLog(@"regionWillChangeAnimated newPoint %f,%f",newPoint.x,newPoint.y);
    [testview  setCenter:CGPointMake(newPoint.x+5,newPoint.y-((testview.frame.size.height/2)+35))];
    [testview setHidden:YES];
}

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    CGPoint newPoint = [self.mapView convertCoordinate:selectedCoordinate toPointToView:self.view];
//    NSLog(@"regionDidChangeAnimated newPoint %f,%f",newPoint.x,newPoint.y);
    [testview  setCenter:CGPointMake(newPoint.x,newPoint.y-((testview.frame.size.height/2)+35))];
    [testview setHidden:NO];
}

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{  
    NSLog(@"Select");
    showCallout = YES;
    CGPoint point = [self.mapView convertPoint:view.frame.origin fromView:view.superview];
    [testview setHidden:NO];
    [testview  setCenter:CGPointMake(point.x+5,point.y-(testview.frame.size.height/2))];
    selectedCoordinate = view.annotation.coordinate;
    [self animateIn];
}

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view 
{
    NSLog(@"deSelect");
    if(!showCallout)
    {
        [testview setHidden:YES];
    }
}

Itt - testview egy UIViewméret 320x100 - showCallout van BOOL - [self animateIn];a funkció, amely nem nézet animáció, mint a UIAlertView.

Válaszolt 26/01/2012 12:08
a forrás felhasználó

szavazat
1

Már tolta ki a villát a kiváló SMCalloutView hogy megoldja a problémát, hogy egy egyéni nézetet feliratokat és lehetővé teszi a rugalmas szélességű / magasságú elég fájdalommentesen. Még néhány hirtelen fordulat, hogy dolgozzanak ki, de ez elég működőképes eddig:

https://github.com/u10int/calloutview

Válaszolt 18/10/2012 00:04
a forrás felhasználó

szavazat
1

Használhatja leftCalloutView, amelyben annotation.text a @”"

Itt találja a példa kód:

pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];
if(pinView == nil){
    pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID] autorelease];       
}
CGSize sizeText = [annotation.title sizeWithFont:[UIFont fontWithName:@"HelveticaNeue" size:12] constrainedToSize:CGSizeMake(150, CGRectGetHeight(pinView.frame))                                 lineBreakMode:UILineBreakModeTailTruncation];
pinView.canShowCallout = YES;    
UILabel *lblTitolo = [[UILabel alloc] initWithFrame:CGRectMake(2,2,150,sizeText.height)];
lblTitolo.text = [NSString stringWithString:ann.title];
lblTitolo.font = [UIFont fontWithName:@"HelveticaNeue" size:12];
lblTitolo.lineBreakMode = UILineBreakModeTailTruncation;
lblTitolo.numberOfLines = 0;
pinView.leftCalloutAccessoryView = lblTitolo;
[lblTitolo release];
annotation.title = @" ";            
Válaszolt 14/04/2011 10:18
a forrás felhasználó

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