2009-08-29 7 views
8

Je construis un UITableView personnalisé avec chacune des cellules contenant un texte et un MKMapView. Je veux que la vue "icône" de la carte dans la cellule ait des coins arrondis et cela semble être un problème. J'utilise un dessin personnalisé à la fois pour mon UITableViewCell et mon MapIcon (vue de carte personnalisée) que j'ajoute à mon UITableViewCell.Coins arrondis de MKMapView

MapIcon est une sous-classe de MKMapView et le procédé d'étirage se présente comme suit:

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

CGContextDrawPath(context, kCGPathFillStroke); 

CGContextClip (contexte); CGContextEndTransparencyLayer (contexte); }

Et les cartes ne reçoivent pas les coins rouned, comme on peut le voir dans la capture d'écran ci-dessous:

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

Si toutefois je modifier le MapIcon sous-classe de UIView et utiliser le même dessin sur mesure méthodes, la vue se clipser parfaitement, l'image ci-dessous:

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

Est-ce que c'est faux pour moi de sous-classer MKMapView d'une telle manière et s'attendre à ce qu'il se clipse? Y a-t-il d'autres arrondissements dans ces coins?

Cheers, KASPA

+0

Avez-vous trouvé que mettre un MapView plante ici quand il sort et ré-entrer dans la vue? –

Répondre

39

La meilleure façon de faire des coins arrondis:

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

Fonctionne comme charme, merci! Il est temps de s'asseoir et de lire plus sur CA Je suppose. – Kaspa

+0

: -o C'est incroyable ce que vous pouvez apprendre de la documentation! –

+0

son coinRadius, pas cornerRadious – samvermette

1

Jetez un coup d'oeil au dernier paragraphe de la section Aperçu de la MKMapView class reference:

Bien que vous ne devriez pas sous-classe de la classe MKMapView elle-même, ...

Je pense que cela répond assez bien à votre question de savoir si vous devriez le sous-classer. Une chose que vous pourriez faire est de mettre une autre vue sur le MKMapView qui ressemble à l'arrière-plan pour arrondir les coins. Si vous avez besoin d'être de taille arbitraire, vous pouvez essayer la méthode strechableImage sur UIImage.

+1

Cette note de sous-classement est écrite dans le contexte de l'obtention des informations concernant le comportement des cartes. Je devrais pouvoir le sous-classer pour maintenir le UIView (juste comme digdog a décrit) – Kaspa

3

Juste une petite correction que la déclaration d'importation est mal orthographié dans la réponse de DigDog.

devrait être

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

Il est également assez facile d'arrondir les coins spécifiques si vous avez besoin. Par exemple, lorsque la carte est situé au sommet d'une NSTableViewCell dans un groupé NSTableView

modifié légèrement 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; 
} 
Questions connexes