2009-08-29 2 views
8

Sto costruendo un UITableView personalizzato con ciascuna cella contenente un pezzo di testo e un MKMapView. Voglio che la vista "icona" della mappa nella cella abbia angoli arrotondati e questo sembra essere un problema.Angoli arrotondati di MKMapView

Sto utilizzando il disegno personalizzato sia per il mio UITableViewCell che per il mio MapIcon (visualizzazione mappa personalizzata) che aggiungo al mio UITableViewCell.

MapIcon è una sottoclasse di MKMapView ed il metodo di disegno appare come segue:

- (void) drawRect: (CGRect) rect {

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetLineWidth(context, strokeWidth); 
CGContextSetStrokeColorWithColor(context,self.strokeColor.CGColor); 
CGContextSetFillColorWithColor(context, self.rectColor.CGColor); 

CGFloat radius = arcRadius; 

CGFloat Xmin = CGRectGetMinX(rect); 
CGFloat Xmid = CGRectGetMidX(rect); 
CGFloat Xmax = CGRectGetMaxX(rect); 

CGFloat Ymin = CGRectGetMinY(rect); 
CGFloat Ymid = CGRectGetMidY(rect); 
CGFloat Ymax = CGRectGetMaxY(rect); 

CGContextBeginPath (contesto); CGContextMoveToPoint (context, Xmin, Ymid); CGContextAddArcToPoint (contesto, Xmin, Ymin, Xmid, Ymin, raggio); CGContextAddArcToPoint (contesto, Xmax, Ymin, Xmax, Ymid, raggio); CGContextAddArcToPoint (contesto, Xmax, Ymax, Xmid, Ymax, raggio); CGContextAddArcToPoint (contesto, Xmin, Ymax, Xmin, Ymid, raggio); CGContextClosePath (contesto);

CGContextDrawPath(context, kCGPathFillStroke); 

CGContextClip (contesto); CGContextEndTransparencyLayer (contesto); }

e le mappe non si ottengono gli angoli rouned, come si può vedere nello screenshot qui sotto:

alt text http://img190.imageshack.us/img190/948/picture1vmk.png

Se però posso cambiare il MapIcon sottoclasse di UIView e utilizzare lo stesso disegno personalizzato metodi, la vista viene ritagliato perfettamente, immagine qui sotto:

alt text http://img503.imageshack.us/img503/6269/picture2xkq.png

È sbagliato per me creare sottoclassi di MKMapView in questo modo e aspettarmi che si agganci? Qualsiasi altro qualsiasi arrotondamento di questi angoli?

Cheers, Kaspa

+0

Hai trovato che mettendo un mapview qui si blocca quando si esce e reinserisce la vista? –

risposta

39

Il modo più semplice per fare angoli arrotondati:

#import <QuartzCore/QuartzCore.h> 
myMapView.layer.cornerRadius = 10.0; 
+0

Funziona come un incantesimo, grazie! È tempo di sedersi e leggere di più su CA, immagino. – Kaspa

+0

: -o È incredibile quello che puoi imparare dalla documentazione! –

+0

suo angoloRadius, non angoloRadious – samvermette

1

Date un'occhiata all'ultimo paragrafo della sezione Panoramica nella MKMapView class reference:

Anche se non dovrebbe sottoclasse della classe MKMapView in sé, ...

Penso che risponda abbastanza bene alla tua domanda se dovresti creare una sottoclasse. Una cosa che potresti fare è mettere un'altra vista sopra MKMapView che assomiglia allo sfondo per arrotondare gli angoli. Se hai bisogno che sia di dimensioni arbitrarie, puoi provare il metodo strechableImage su UIImage.

+1

Questa nota di sottoclasse viene scritta nel contesto di ottenere le informazioni sul comportamento delle mappe. Dovrei essere in grado di creare una sottoclasse per mainpolare l'UIView (proprio come ha descritto il digdog) – Kaspa

3

Solo una piccola correzione come l'istruzione import è trascritto erroneamente nella risposta di digdog.

Dovrebbe essere

#import <QuartzCore/QuartzCore.h> 
myMapView.layer.cornerRadius = 10.0; 
0

E 'anche abbastanza facile per arrotondare gli angoli specifici, se avete bisogno. Ad esempio, quando la mappa si trova nella parte superiore di un NSTableViewCell all'interno di una raggruppati NSTableView

Leggermente modificato da ACEToolKit:

#import <QuartzCore/QuartzCore.h> 
- (void)awakeFromNib { 
CGRect rect = self.bounds; 
float radius = 10.f; 

// Create the path 
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:rect 
               byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight 
                cornerRadii:CGSizeMake(radius, radius)]; 

// Create the shape layer and set its path 
CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
maskLayer.frame = rect; 
maskLayer.path = maskPath.CGPath; 

// Set the newly created shape layer as the mask for the view's layer 
self.mapView.layer.mask = maskLayer; 
}