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ć:
- stworzony nowy imageCGcontex
- wygenerowana mapa w nowy CGcontext
- dostał UIImage od aktualnej CGcontext
- stosowane CIFilter do UIImage i dostał CIImage w wyniku
- renderowane CIImage w CIContext i dostał CGImageRef jako wynik
- stworzony UIImage z CGImageRef
- dodał sub ImageView na mapie jabłkowego widzenia
- 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.
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
http://developer.apple.com/library/ios/#qa/qa1703/_index.html - link nie działa _ (Niestety, tej strony nie można znaleźć.) _ – Nazir