2011-04-19 3 views
9

J'ai un NSBezierPath qui fait un rectangle arrondi mais les coins de celui-ci semblent saccadés et semblent plus brillants que le reste du trait vu à pleine échelle. Mon code est:Le rectangle arrondi de NSBezierPath a de mauvais coins

NSBezierPath *path = [NSBezierPath bezierPath]; 
    [path appendBezierPathWithRoundedRect:NSMakeRect(0, 0, [self bounds].size.width, [self bounds].size.height) xRadius:5 yRadius:5]; 

    NSGradient *fill = [[NSGradient alloc] initWithColorsAndLocations:[NSColor colorWithCalibratedRed:0.247 green:0.251 blue:0.267 alpha:0.6],0.0,[NSColor colorWithCalibratedRed:0.227 green:0.227 blue:0.239 alpha:0.6],0.5,[NSColor colorWithCalibratedRed:0.180 green:0.188 blue:0.196 alpha:0.6],0.5,[NSColor colorWithCalibratedRed:0.137 green:0.137 blue:0.157 alpha:0.6],1.0, nil]; 
    [fill drawInBezierPath:path angle:-90.0]; 

    [[NSColor lightGrayColor] set]; 
    [path stroke]; 

Heres une image de 2 des coins (ne est pas aussi évident dans une petite image):

corners

Quelqu'un sait ce qui cause cela? Est-ce que je manque juste quelque chose?

Merci pour toute aide

Répondre

18

Les lignes droites du rectangle sont exactement sur les bords de la vue, donc la moitié de la largeur de chaque ligne est coupée. (Comme s'ils étaient sur un sous-pixel.)

Essayez de changer

NSMakeRect(0, 0, [self bounds].size.width, [self bounds].size.height) 

à

NSMakeRect(0.5, 0.5, [self bounds].size.width - 1, [self bounds].size.height - 1) 

Si un NSBezierPath semble toujours un peu bizarre ou floue, essayez décalant plus d'un demi pixel.

+0

Travaillé comme par magie! Merci beaucoup. – nosedive25

+2

Plutôt que de le décaler d'un demi-pixel, il est généralement préférable d'insérer le dessin sur la moitié de la largeur de trait du tracé, ce que vous faites réellement ici. –

+6

Plus court chemin: NSInsetRect (self.bounds, 0.5, 0.5) – sergeyne

0

Jetez un oeil à la méthode setFlatness: dans les NSBezierPath docs. Il contrôle la façon dont les courbes sont lisses. Je crois que le placer à un plus petit nombre (la valeur par défaut étant .6) donnera des courbes plus lisses, au prix de plus de calculs (bien que pour les chemins simples, je doute que cela ait beaucoup d'importance).

Questions connexes