2011-04-19 26 views
9

Yuvarlatılmış bir dikdörtgeni oluşturan ancak köşeleri yıpranmış ve tam ölçek olarak görüntülendiğinde konturun geri kalanı daha parlak görünen bir NSBezierPath10 var. Benim kodudur:NSBezierPath yuvarlatılmış köşenin kötü köşeleri var

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]; 

İşte köşeleri (küçük bir resimde Onun kadar açık değildir) ait 2 'lik bir resmi:

corners

Herkes bunun ne biliyor? Sadece bir şeyi özlüyor muyum? herhangi bir yardım

cevap

18

Yuvarlak doğruların düz çizgileri tam olarak görünümün kenarlarındadır, bu nedenle her satırın yarısı kesilir. (Sanki onlar altpikselden vardı.)

bir NSBezierPath hiç biraz garip veya bulanık görünüyorsa, yarım piksel üzerine kayması deneyin

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

için

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

değiştirmeyi deneyin.

+0

Büyü gibi çalıştı! Çok teşekkürler. – nosedive25

+2

Yarım pikselle kaydırmak yerine, çizimi, kodun aslında burada yaptıklarınız olan kontur genişliğinin yarısı kadar çizmesi daha iyi bir fikirdir. –

+6

Daha kısa yol: NSInsetRect (self.bounds, 0.5, 0.5) – sergeyne

0

için

Teşekkür NSBezierPath docs setFlatness: yöntemin bir göz atın. İşlenen eğrilerin ne kadar düzgün olduğunu kontrol eder. Daha küçük bir sayıya (varsayılan değer .6) ayarlanmasının daha fazla hesaplama maliyetiyle daha düzgün eğriler kazandıracağına inanıyorum (basit yollar için olsa da, çok önemli olduğunu düşünüyorum).