2009-08-29 22 views
8

Estoy construyendo un UITableView personalizado con cada una de las celdas que contienen una pieza de texto y un MKMapView. Quiero que la vista de "icono" del mapa en la celda tenga esquinas redondeadas y esto parece ser un problema.Esquinas redondeadas de MKMapView

Estoy usando un dibujo personalizado tanto para mi UITableViewCell como para mi MapIcon (vista de mapa personalizada) que agrego a mi UITableViewCell.

MapIcon es una subclase de MKMapView y el método de dibujo se ve de la siguiente manera:

- (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 (contexto); CGContextMoveToPoint (context, Xmin, Ymid); CGContextAddArcToPoint (contexto, Xmin, Ymin, Xmid, Ymin, radio); CGContextAddArcToPoint (contexto, Xmax, Ymin, Xmax, Ymid, radio); CGContextAddArcToPoint (contexto, Xmax, Ymax, Xmid, Ymax, radio); CGContextAddArcToPoint (contexto, Xmin, Ymax, Xmin, Ymid, radio); CGContextClosePath (contexto);

CGContextDrawPath(context, kCGPathFillStroke); 

CGContextClip (context); CGContextEndTransparencyLayer (contexto); }

Y los mapas no reciben las esquinas rouned, como se puede ver en la siguiente imagen:

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

Sin embargo, si puedo cambiar el MapIcon subclase de UIView y utilizar el mismo métodos de dibujo personalizado, la vista se recorta a la perfección, por debajo de la imagen:

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

¿Está mal para mí subclasificar MKMapView de tal manera y esperar que se clip? ¿Alguna otra de redondear estas esquinas?

Saludos, Kaspa

+0

¿Ha encontrado que poner un MapView aquí se bloquea cuando sale y re-enteres la vista? –

Respuesta

39

La manera más fácil de hacer esquinas redondeadas:

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

¡Funciona como el encanto, gracias! Es hora de sentarse y leer más sobre CA, supongo. – Kaspa

+0

: -o ¡Es sorprendente lo que puede aprender de la documentación! –

+0

su esquinaRadio, no esquinaRadio – samvermette

1

Tome una mirada en el último párrafo de la sección general en el MKMapView class reference:

A pesar de que no debe subclase de la clase en sí MKMapView, ...

Creo que responde bastante bien a su pregunta de si debe subclase. Una cosa que podrías hacer es poner otra vista encima de MKMapView que se parece al fondo para redondear las esquinas. Si necesita que tenga un tamaño arbitrario, puede probar el método strechableImage en UIImage.

+1

Esa nota de subclases se escribe en el contexto de obtener la información sobre el comportamiento de los mapas. Debería ser capaz de crear una subclase para poder utilizar el UIView (tal como lo describió digdog) – Kaspa

3

Sólo una pequeña corrección como la declaración de importación se mal escrito en la respuesta de digdog.

Debe ser

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

También es bastante fácil para redondear esquinas específicas si es necesario. Por ejemplo, cuando el mapa se encuentra en la parte superior de un NSTableViewCell dentro de un agrupados NSTableView

ligeramente modificado a partir de 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; 
}