Мне нужны были те же манипуляции с цветом на карте, и я решил, что сделать всю карту черно-белой может быть лучшим решением, вот как вы можете это сделать:
- создано новое изображение CGcontex
- рендеринг карты в новом CGcontext
- получил UIImage от текущего CGcontext
- применил CIFilter к UIImage и получил CIImage в результате
- визуализировал CIImage в CIContext и получил CGImageRef в результате
- создал UIImage из CGImageRef
- добавлен вид подизображения для вида карты яблока
- установить изображение результата для этого изображения.
Вот некоторый грязный код для этого:
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();
Вот, пожалуйста, карта черного и белого цветов.
Чтобы сделать это динамически, чтобы перемещать монохромную карту вместе с жестом пользователя, вы можете использовать распознаватель жестов подкласса, добавив его непосредственно в представление карты. Затем при каждом вызове touchesMoved
вы можете вызывать эту функцию перерисовки, используя повторно созданный вами контекст. Я попробовал это с яблочной картой, занимающей около 1/3 экрана, и это привело к чрезвычайно низкой производительности (около 3 кадров в секунду на iPhone 5s), и есть несколько ошибок, которые вы должны исправить, например: летающая карта при жесте смахивания во время монохромного изображения является статическим, частота перерисовки пинов карты, перерисовки или анимации каждого всплывающего окна, отображаемого в ответ на нажатие. Вы можете попытаться отобразить карту в CALayer, а не в Context. Apple рекомендует улучшить производительность, но, учитывая все вышесказанное, я полагаю, если вы хотите видеть динамически фильтруемые элементы, лучше использовать другую, более настраиваемую карту: GoogleMap или MapBox.