2012-01-24 14 views
5

Ho un MKMapView e sto aggiungendo un overlay (MKOverlay) ad esso.Sovrapposizione in bianco e nero per un MKMapView

Desidero che l'overlay faccia apparire la vista della mappa sottostante in nero & bianco (ad es. Monocromatico). C'è un modo per farlo?

(Credo che avrei potuto fare la sovrapposizione semitrasparente nero/grigio, ma non è l'esatto effetto vorrei.)


dettagli di sistema: in via di sviluppo un app iOS 5 in Xcode 4.2.

risposta

7

Il percorso più corretto, che purtroppo non è ancora disponibile su iOS sarebbe:

tuo MKOverlay è ad un certo punto viene utilizzato per creare un MKOverlayView, che avrà un CALayer mentre scende da UIView. È possibile allegare CIFilter s come compositingFilter s a CALayer s, che determina come la vista è composta con lo sfondo. È possibile collegare un filtro di tipo CIColorMonochrome a quello.

Poiché questa opzione non è disponibile, dovrai superare alcuni ostacoli importanti per eseguire il lavoro da solo. Probabilmente dovrai implementare la tua personalizzata MKOverlayView che nella sua drawView utilizza le tecniche fornite in Apple QA1703 per ottenere il contenuto dei pixel della vista mappa nell'area pertinente (fai attenzione però a non finire in un ciclo ricorsivo infinito), trasforma quelli in bianco e nero e presentali come tua vista.

È qualcosa che vale la pena di indagare ulteriormente o si sarebbe più felice di sostituire l'effetto piuttosto che approfondire veramente questa roba?

+0

Qualcuno ha fatto questo? Non sta facendo filtri come una fucilazione? questa fica non si applica solo all'overlay e non alla mappa sottostante? – subharb

+0

http://developer.apple.com/library/ios/#qa/qa1703/_index.html - link non funzionante _ (Siamo spiacenti, la pagina non è stata trovata.) _ – Nazir

1

mi serviva stesse manipolazioni di colore sulla carta, e ho deciso che, per rendere l'intera mappa in bianco e nero può essere la soluzione migliore, ecco come si può fare questo:

  1. creato nuove imageCGcontex
  2. mappa reso in new CGcontext
  3. ottenuto UIImage dalla corrente CGcontext
  4. applicato CIFilter a UIImage e ottenuto CIImage come risultato
  5. reso CIImage in CIContext e ottenuto CGImageRef come risultato
  6. creato UIImage da CGImageRef
  7. immagine set di risultati aggiunti sub ImageView ad Apple guarda la mappa a quella IMAGEVIEW

Ecco il codice sporco per fare questo:

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();

Qui vai - la mappa è in nero e w colori hite. Per eseguire dinamicamente questa operazione per spostare la mappa monocromatica insieme al gesto dell'utente, è possibile creare una sottoclasse di riconoscimento gesti, aggiungerla direttamente alla visualizzazione mappa. Quindi su ogni chiamata touchesMoved puoi chiamare questa funzione di ridisegno mentre riutilizzi il contesto che hai creato.Ho provato questo con la mappa delle mele che occupa circa 1/3 dello schermo e ha prodotto prestazioni estremamente basse (circa 3 FPS su iPhone 5s) e ci sono alcuni bug da correggere, come ad esempio: la mappa di volo con il gesto di scorrimento mentre l'immagine monocromatica è statico, la frequenza dei pin della mappa è ridisegnare, ridisegnare o animare ogni pop-up visualizzato in risposta a toccare. Puoi provare a renderizzare la mappa in CALayer, non in Context, Apple consiglia di migliorare le prestazioni, ma considerando tutto quanto sopra suppongo che se vuoi vedere elementi filtrati dinamici è meglio usare un'altra mappa più personalizzabile: GoogleMap o MapBox.

Problemi correlati