2013-07-10 26 views
7

NSSlider'ı ayarlarken UIMapView'da MKCircleView'ın düzgün yeniden boyutlandırılmasını nasıl sağlayabilirim? Apple, geofences (http://reviewznow.com/wp-content/uploads/2013/03/find-my-friends-location-alerts-01.jpg) oluştururken Arkadaşlarımı bul uygulamasında bunu başardı, bu yüzden bir şekilde mümkün olduğunu tahmin ediyorum. (AynıMKCircle'ın düzgün yeniden boyutlandırılması

İlk denemesi

Ben güncelleştirilmiş yarıçap ve hemen oldu birini çıkardıktan sonra yeni bir MKCircleView ekledi: Şimdiye kadar aşağıdaki çözümleri denedim ama çok "flickery" sonucunun kaydırıcı değeri değiştirdiğinde burada MKOverlay not resizing smoothly önerilir. Ben de başka bir şekilde denedim: ilk önce bindirmeyi kaldırdıktan sonra yeni bir tane ekleyerek aynı "fiske" sonucuyla.

- (void)sliderChanged:(UISlider*)sender 
{ 
    double radius = (sender.value * 100); 
    [self addCircleWithRadius:radius]; 
    [mapView removeOverlays:[self.mapView.overlays firstObject]]; 
} 

İkinci girişim ise

SO cevap, o NSOperation ve böylece ekleme yukarıdaki yöntemi kullanarak pürüzsüz yeniden boyutlandırma yapmak "Eğer MKCircle hızlı nesneleri oluşturmanıza yardımcı" için kullanılabilir düşündürmektedir bağlantılı Slaytlar değeri değiştirdiğinde bindirmeleri kaldırır. Kaydırıcı değiştiğinde yeni bir iş parçacığı başlattığım bir uygulama yaptım. Her iş parçacığında eski tüm katmanları kaldırırım ve güncellenmiş ölçekle yeni bir tane ekleyin. Belki de akılda başka bir tür uygulama vardır, çünkü bunu yaptığım gibi, kaydırıcıyı değiştirirken hala aynı titremeyi görüyorum.

- (void)sliderChanged:(UISlider*)sender 
{ 
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self 
                      selector:@selector(updateOverlayWithScale:) 
                       object:[NSNumber numberWithFloat:sender.scale]]; 
    [self.queue addOperation:operation]; 
} 

i her iş parçacığı çalıştırır yöntemi:

- (void)updateOverlayWithScale:(NSNumber *)scale 
{ 
    MKCircle *circle = [MKCircle circleWithCenterCoordinate:self.currentMapPin.coordinate 
                radius:100*[scale floatValue]]; 


    [self.mapView performSelectorOnMainThread:@selector(removeOverlays:) withObject:self.mapView.overlays waitUntilDone:NO]; 
    [self.mapView performSelectorOnMainThread:@selector(addOverlay:) withObject:circle waitUntilDone:NO]; 
} 

Üçüncü girişimi

Ben de onun ölçek özelliği temel kendisini çizer MKOverlayView benim kendi alt sınıfı uygulayan çalıştı. Kaydırıcı her değiştiğinde setNeedsDisplay öğesini çağırıp, kendisini yeniden çizmesine izin veriyorum, ancak aynı titremeyi alıyorum. zoomScale: InContext:

- (void)sliderChanged:(UISlider*)sender 
{ 
    self.currentOverlayView.scale = sender.scale 
    [self.currentOverlayView setNeedsDisplay]; 
} 

Ve drawMapRect uygulamak benim özel kaplama görünümü içinde

Yani bu

- (void)drawMapRect:(MKMapRect)mapRect 
      zoomScale:(MKZoomScale)zoomScale 
      inContext:(CGContextRef)context 
{ 
    double radius = [(MKCircle *)[self overlay] radius]; 
    radius *= self.scale; 

    // ... Create a rect using the updated radius and draw a circle inside it using CGContextAddEllipseInRect ... 

} 

gibi (CGContextRef) bağlamını, herhangi bir fikrin var mı? Şimdiden teşekkürler!

+0

sağlanması için yickhong gitmek ile ihtiyaçlarınıza ince ayar yapmak mümkün olabilir gibi göz atın ? –

cevap

0

Birkaç ay önce this animated MKCircleView'u buldum. Ayrıca git bir demo var. Yani sanırım bir vermelisin! Bir slider vb

Kredi, bunu nasıl yaptın ben de bununla mücadele ediyorum bu YHAnimatedCircleView