Nasıl MKAnnotationView için çizgisi balonu özelleştirmek için?

oy
87

Şu anda mapkit ile çalışan ve şaşırıp ediyorum.

Ben kullanıyorum özel açıklama görünümü var ve ben kendi simgesi ile harita üzerinde noktayı göstermek için resim özelliğini kullanmak istiyorum. Bu çalışma cezası var. Ama benim de yapmak istiyorum varsayılan çizgisi görünümü (açıklama simgesi dokunulduğunda başlık / altyazı ile gösterir balonu) geçersiz kılmak etmektir. Ben belirtme çizgisi kendisini kontrol edebilmek istiyorum: mapkit sadece sol ve sağ yan çizgisi manzarası, ama belirtme çizgisi balonu için özel bir görünüm sağlamak için, ya da o boyutu sıfır veya başka bir şey vermek için hiçbir şekilde erişim sağlar.

Benim fikrim skinTenimde selectAnnotation / deselectAnnotation geçersiz kılmak oldu MKMapViewDelegateve sonra benim özel açıklama görünümüne arama yaparak kendi özel görünümünü çizin. Bu çalışır, ancak sadece canShowCalloutayarlandığında YESbenim özel açıklama görünümü sınıfında. Ben bu seti varsa bu yöntemler denilen DEĞİLDİR NO(varsayılan çizgisi kabarcık çizilmez böylece, benim istediğim şey olan). Yani kullanıcı harita üzerinde benim açımdan değindi eğer bilmenin bir yolu var (o seçildi) ya da benim açıklama görüş parçası olmayan bir noktaya dokundu varsayılan çizgisi kabarcık görünümü gösterisi yukarı kalmadan (onu delected).

Ben farklı bir yolda gidiyor ve sadece haritadaki kendim tüm dokunmatik olaylarını ele ve ben bu çalışma almak gibi olamaz çalıştı. Ben harita görünümünde dokunmatik olaylarını yakalamak ilgili diğer mesajları okumak ama ben istemiyorum tam olarak ne olduğunu. Çizim önce çizgisi balonu kaldırmak için harita görünümünde içine kazmak için bir yol var mı? Ben bir kayıp değilim.

Baska öneri? Ben belirgin bir şey eksik?

Oluştur 14/10/2009 saat 13:02
kaynak kullanıcı
Diğer dillerde...                            


9 cevaplar

oy
53

Bir daha da kolay bir çözüm yoktur.

Özel bir oluştur UIView(Ek bilginizin için).

Sonra bir alt sınıfı oluşturmak MKAnnotationViewve geçersiz kılma setSelectedşöyle:

- (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, iş bitmiş.

Cevap 05/08/2011 saat 12:16
kaynak kullanıcı

oy
40

detailCalloutAccessoryView

Eski günlerde sadece üzerinde doküman kontrol, bu acı, ama Apple bunu çözdü MKAnnotationView

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

Gerçekten, bu kadar. Herhangi UIView alır.

Cevap 23/07/2012 saat 13:44
kaynak kullanıcı

oy
13

Varsayılan bir aynı şekilde kabarcık animasyon istiyorsanız, bu animasyon yöntemi üretilen ettik TappCandy en zekice basit cevabı @ yola devam edildiğinde:

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

Bu sadece değiştirmek gerekir, oldukça karmaşık, fakat Ek bilgi balonunun noktası merkez dibe olarak tasarlanmıştır sürece görünüyor myBubbleWidthve myBubbleHeightkendi boyutu ile işe yaraması için. Ve subviews onların emin olun unutmayın autoResizeMaskonlar animasyon doğru ölçek böylece ( "tüm" ie) özelliği 63'e ayarlayın.

: -Joe

Cevap 24/10/2011 saat 13:41
kaynak kullanıcı

oy
8

Bunu buldum benim için en iyi çözüm olarak. Kendi özelleştirmeleri yapmak için bazı yaratıcılık kullanmak gerekecektir

Senin içinde MKAnnotationViewalt sınıf, kullanabilirsiniz

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

Ve eğer subviewbir olduğunu UICalloutView, o zaman onunla etrafında vida ve ne var içinde olabilir.

Cevap 31/08/2011 saat 21:36
kaynak kullanıcı

oy
6

Ben de aynı sorun vardı. Bu blogda bu konu hakkında bir blog gönderisi ciddi yoktur http://spitzkoff.com/craig/?p=81 .

Sadece kullanarak MKMapViewDelegateburada ve sınıflara yardımcı olmaz MKMapViewve ayrıca benim için işe yaramadı mevcut işlevselliğini genişletmek için çalışıyor.

Ne yaptığını sona erdi kendi yaratmaktır CustomCalloutViewyaşıyorum benim üstünde yaşıyorum o MKMapView. İstediğiniz herhangi bir şekilde bu görüşü stil özelliklerini ayarlayabilirsiniz.

Benim CustomCalloutViewbuna benzer bir yöntemi vardır:


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

Bir sürer MKAnnotationnesne ve kendi başlık ayarlayan, sonra o çizgisi içeriğinin genişliği ve boyutunu ayarlamak ve sonra doğru pozisyonda etrafında konuşma balonunu çizin oldukça çirkin olan iki diğer yöntemleri çağırır.

Son olarak görünüşüdür MapView bir subview ilave edilir. Bu çözüm ile sorun harita görünümü kaydırıldığında doğru pozisyonda Ek bilgiyi tutmak zor olmasıdır. Sadece bu sorunu çözmek için bir bölge değişikliği harita görünümleri temsilci yönteminde ek bilgiyi saklanıyorum.

Tüm bu sorunları çözmek için biraz zaman aldı ama şimdi çizgisi neredeyse resmi biri gibi davranır, ama kendi tarzında içinde var.

Cevap 16/10/2009 saat 11:35
kaynak kullanıcı

oy
5

a) geliyor varsayılan çizgisi balonu engelleme: Temelde bu çözmek için, tek gerekiyor. b) tıklandığı açıklama çözmek.

a) HAYIR b) altsınıflamayla MKPinAnnotationView için canShowCallout ayarlama ve touchesBegan ve touchesEnd yöntemlerini geçersiz: Bunları tarafından elde etmeyi başardı.

Not: MKAnnotationView olup MKMapView için dokunmatik olayları işlemek için ihtiyaç

Cevap 20/11/2009 saat 12:22
kaynak kullanıcı

oy
3

Ben sadece bir yaklaşım ile gelip, fikir, burada

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

İşte - testview bir olduğunu UIViewshowCallout BOOL olduğunu - - boyutunda 320x100 ait [self animateIn];gibi görünüm animasyon yapar fonksiyondur UIAlertView.

Cevap 26/01/2012 saat 12:08
kaynak kullanıcı

oy
1

Ben ek bilgi için özel bir görünümünü sağlayarak ve oldukça acısız esnek genişlikleri / yükseklikleri izin sorunu çözer mükemmel SMCalloutView benim çatal dışarı itti ettik. Yine bazı tuhaflıklar çalışmak, ancak şu ana kadar oldukça işlevsel var:

https://github.com/u10int/calloutview

Cevap 18/10/2012 saat 00:04
kaynak kullanıcı

oy
1

Sen hiç annotation.text ayarlayarak, leftCalloutView kullanabilirsiniz @""

örnek kod aşağıda bulabilirsiniz:

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 = @" ";            
Cevap 14/04/2011 saat 10:18
kaynak kullanıcı

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