2012-05-27 58 views
12
寬路徑

我畫在我的drawRect實施路徑上一個UIView有:繪製1個像素的iOS

CGContextSetLineWidth(context, 0.5); 
CGContextStrokePath(context); 

抗鋸齒對我的CGContext上,我似乎無法畫1條像素線。

on

我試圖打開反鋸齒關閉有:

CGContextSetShouldAntialias(context, NO); 

但後來我的邊角看起來可怕:

off

如何保持反鋸齒上,但停止該子1像素線的像素模糊?

+0

核芯顯卡不使用像素,但點。 – uchuugaka

回答

23

當繪製在iOS的一條線,你指定一個無限縮小線的座標。畫出的線將延伸到該線的兩側一半的筆畫寬度。

如果您的無限窄線具有整數座標和是水平或垂直的,所繪製的線將是兩個像素寬和灰色的,而不是一個像素寬和黑色(用抗混疊)。沒有抗鋸齒功能,線條會稍微移動,但角落看起來很醜。

爲了解決它,用在像素的中間座標(例如200.5/170.5),並打開反鋸齒上。

+0

我以爲我以前試過這個,它工作,但由於某種原因,它現在不工作,我不明白爲什麼... – chrism

+7

杜!對不起,我並沒有真正在想 - 視網膜顯示器顯然意味着你畫的縮放空間中像素的中間位置是.25,而不是0.50。 – chrism

+1

@chrism +1這不是「杜!」對我來說,如果我沒有像這樣偶然發現它,我認爲我從未想過...... – Mazyod

10
- (void)drawRect:(CGRect)rect 
{ 
    [super drawRect:rect]; 

    CGFloat inset = 0.5/[[UIScreen mainScreen] scale]; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(context); 
    // draw 
    CGContextSetLineWidth(context, inset); 
    CGContextSetStrokeColorWithColor(context, _lineColor.CGColor); 
    CGContextMoveToPoint(context, inset, 0); 
    CGContextAddLineToPoint(context, inset, CGRectGetHeight(rect)); 
    CGContextStrokePath(context); 
    CGContextRestoreGState(context); 
} 
+0

那是什麼'WKCommonUtil' thingy? –

+0

@AndréFratelli可能是檢測視網膜設備的第三個框架。 –

+0

@AndréFratelli,這是我自己製作的一個util類,用於測試設備是否爲視網膜。 – Chengjiong

0

您可以通過翻譯所有方面:

CGContextSaveGState(context); 
CGFloat translation = 0.5f/[[UIScreen mainScreen] scale]; 
CGContextTranslateCTM(context, translation, translation); 
... your drawing here ... 
CGContextRestoreGState(context); 

這一切!

0

爲我工作的唯一的解決辦法是這樣的:

override func drawRect(rect: CGRect) { 

    let context = UIGraphicsGetCurrentContext() 

    CGContextSetLineWidth(context, 0.5) 

    CGContextMoveToPoint(context, 0.0, 0.25) 
    CGContextAddLineToPoint(context, rect.size.width, 0.25) 

    CGContextSetStrokeColorWithColor(context, UIColor.blackColor().CGColor) 
    CGContextStrokePath(context) 
}