2012-01-24 10 views
5

Mam MKMapView i dodam do niego nakładkę (MKOverlay).Czarno-biała nakładka dla MKMapView

Chciałbym, aby nakładka uczyniła pod nią widok mapy, aby wyglądała na czarną & biały (to znaczy monochromatyczny). Czy jest jakiś sposób na zrobienie tego?

(chyba mogę zrobić nakładkę prześwitujący czarny/szary, ale nie jest to dokładny efekt chciałbym).


szczegóły systemowe: rozwijanie aplikacji iOS 5 w Xcode 4.2.

Odpowiedz

7

najbardziej właściwa droga, która niestety nie jest jeszcze dostępna na iOS będzie:

Twój MKOverlay jest w pewnym momencie być wykorzystywane do tworzenia MKOverlayView, co będzie miało CALayer gdyż pochodzi od UIView. Możesz dołączyć CIFilter s jako compositingFilter s do dyktowania, w jaki sposób widok jest połączony z tłem. Do tego można dołączyć filtr typu CIColorMonochrome.

Ponieważ ta opcja nie jest dostępna, będziesz musiał wykonać kilka poważnych przeszkód, aby wykonać pracę dla siebie. Prawdopodobnie będziesz musiał zaimplementować swój własny niestandardowy MKOverlayView, który w swoim drawView używa technik podanych w Apple QA1703, aby uzyskać zawartość piksela w widoku mapy w odpowiednim obszarze (uważaj, aby nie skończyć w nieskończonej pętli rekurencyjnej), przekształć je w czarno-białe i przedstaw je jako swój widok.

Czy jest to coś, co warto zbadać dalej, czy byłbyś szczęśliwy zastępując efekt, niż naprawdę zagłębić się w te rzeczy?

+0

Czy ktoś to zrobił? Czy tworzenie filtrów nie jest łatwe? czyż ta sugestia nie odnosi się tylko do Nakładki, a nie do mapy pod nią? – subharb

+0

http://developer.apple.com/library/ios/#qa/qa1703/_index.html - link nie działa _ (Niestety, tej strony nie można znaleźć.) _ – Nazir

1

Musiałem sam kolor manipulacje na mapie, i postanowiłem, że co cała mapa czerni i bieli może być lepszym rozwiązaniem, oto jak można to zrobić:

  1. stworzony nowy imageCGcontex
  2. wygenerowana mapa w nowy CGcontext
  3. dostał UIImage od aktualnej CGcontext
  4. stosowane CIFilter do UIImage i dostał CIImage w wyniku
  5. renderowane CIImage w CIContext i dostał CGImageRef jako wynik
  6. stworzony UIImage z CGImageRef
  7. dodał sub ImageView na mapie jabłkowego widzenia
  8. zbioru wynikowego obrazu do tego ImageView

Oto brudny kod to zrobić:

self.drawContext = [[CIContext alloc] init]; 
 
    [self.monochromeSubView removeFromSuperview]; 
 

 
    UIGraphicsBeginImageContext(self.appleMapView.bounds.size); 
 
    UIImage *mySourceImage = UIGraphicsGetImageFromCurrentImageContext(); 
 
    CIImage *newMyCiImage = [[CIImage alloc] initWithImage:mySourceImage]; 
 
    CIFilter *newMyMonochromeFilter = [CIFilter filterWithName:@"CIPhotoEffectTonal"]; 
 
    [newMyMonochromeFilter setValue:newMyCiImage forKey:kCIInputImageKey]; 
 
    CIImage *newMyfilteredCIImage = newMyMonochromeFilter.outputImage; 
 
    
 
    CGImageRef myOutputImageRef = [self.drawContext createCGImage:newMyfilteredCIImage 
 
                 fromRect:newMyfilteredCIImage.extent]; 
 
    UIImage *newMyImage = [[UIImage alloc] initWithCGImage:myOutputImageRef]; 
 

 
    self.monochromeSubView.image = newMyImage; 
 
    [self.appleMapView addSubview:self.monochromeSubView]; 
 

 
    CGImageRelease(myOutputImageRef); 
 
    UIGraphicsEndImageContext();

Tutaj idziesz - mapa jest czarna, a w hite kolory. Aby zrobić to dynamicznie, aby przesunąć mapę monochromatyczną wraz z gestem użytkownika, możesz rozpoznać gesty podklasy, dodaj ją bezpośrednio do widoku mapy. Następnie na każde wywołanie touchesMoved możesz wywołać tę funkcję przerysowywania, ponownie korzystając z kontekstu, który kiedyś stworzyłeś.Spróbowałem tego z mapą jabłka zajmującą około 1/3 ekranu, co zaowocowało wyjątkowo niską wydajnością (około 3 FPS na iPhone'a 5s) i trzeba naprawić kilka błędów, takich jak: latająca mapa gestem przesunięcia, podczas gdy obraz monochromatyczny jest statyczny, częstotliwość odświeżania pinów map, przerysowywania lub animowania każdego wyskakującego okienka wyświetlanego w odpowiedzi na dotknięcie. Możesz spróbować renderować mapę w CALayer, nie w kontekście, Apple poleca ją, by poprawić wydajność, ale biorąc pod uwagę wszystkie powyższe, przypuszczam, że jeśli chcesz widzieć dynamicznie filtrowane elementy, lepiej użyć innej, bardziej konfigurowalnej mapy: Google Map lub MapBox.