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!
sağlanması için yickhong gitmek ile ihtiyaçlarınıza ince ayar yapmak mümkün olabilir gibi göz atın ? –