2010-11-19 46 views
8

我有一個UIView並在其中我已經繪製了使用核心圖形通過覆蓋drawRect。這個視圖還包含一個子視圖,它也繪製了一條線。然而,儘管這兩種觀點都使用幾乎相同的代碼(用於測試至少),他們繪製的線條不會出現相同的:iPhone核心圖形爲子視圖較粗的虛線

Image problem

正如你所看到的 - 在虛線頂部明顯比底部厚,我不知道爲什麼。以下是兩個UIViews在其drawRect方法中使用的代碼。如果您有任何想法,爲什麼發生這種情況,那麼我會感謝您的幫助和建議!

首先查看:

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] CGColor]); 

CGFloat dashes[] = {1,1}; 

CGContextSetLineDash(context, 0.0, dashes, 2); 
CGContextSetLineWidth(context, 0.6); 

CGContextMoveToPoint(context, CGRectGetMinX(rect), CGRectGetMaxY(rect)); 
CGContextAddLineToPoint(context, CGRectGetMaxX(rect), CGRectGetMaxY(rect)); 

CGContextStrokePath(context); 

SubUIView *view = [[SubUIView alloc] initWithFrame:rect]; 
[self addSubview:view]; 
[view release]; 

的觀點肯定是隻被抽一次。我讚賞drawRect可能不是添加子視圖的最佳位置,但問題依然存在,即使在主要的initWithFrame方法中添加了該問題。

第二個視圖:

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] CGColor]); 

CGFloat dashes[] = {1,1}; 

CGContextSetLineDash(context, 0.0, dashes, 2); 
CGContextSetLineWidth(context, 0.6); 

CGContextMoveToPoint(context, CGRectGetMinX(rect), CGRectGetMidY(rect)); 
CGContextAddLineToPoint(context, CGRectGetMaxX(rect), CGRectGetMidY(rect)); 

CGContextStrokePath(context); 
+1

爲什麼要在第一個視圖的'drawRect:'中添加子視圖? – jer 2010-11-19 22:34:57

+0

@jer:這一定很重要嗎?我可以從另一個方法如'initWithFrame'添加子視圖,但是線寬仍然存在差異。除非我不打算將子視圖添加到本身「繪製」並因此出現問題(?)的視圖上,但我沒有在任何地方讀過......但是。 – JoeR 2010-11-19 22:41:24

+1

@JoeR,是的,它可能很重要 - 每次您的視圖自己繪製時都會添加子視圖,因此您可以通過放置多個相同的子視圖來結束視覺效果 - 這可能會導致子視圖線變得更粗,因爲它們被繪製多次 – Vladimir 2010-11-19 22:44:12

回答

6

這可能是抗鋸齒的結果,如果你的矩形不落在整數。您可以使用CGContextSetShouldAntialias(context, NO)禁用消除鋸齒功能。我認爲還有一個讓矩陣積分的函數,但我不記得它是什麼。

+0

謝謝!這固定它!我想通過調用'CGContextSetStrokeColorWithColor'指定的這兩行都不是固定的白色這一事實應該是一些反鋸齒正在發生的線索。我很想知道爲什麼這發生在子視圖中,而不是在主視圖中,但現在我只是感謝它的工作! – JoeR 2010-11-19 23:05:27

+3

這是CGRectIntegral() – nielsbot 2011-05-05 06:59:50

-2

首先,您應該修復繪圖代碼爲WET *的問題。你說你這樣做是爲了「測試目的」,但這實際上使得測試變得更加困難,因爲你必須改變這兩個代碼段和/或保持你正在使用的版本的直接性。最糟糕的情況是,當你以不同的方式更改這兩個代碼段並且必須手工合併它們時。

我想說的是將虛線代碼移到子視圖中,爲兩段代碼需要做的改變添加屬性,並創建兩個子視圖(而不是在drawRect:中)。

至於實際的問題:好吧,我沒有看到一個大的圖像,我看到一個小圖像,我只能猜測,上線的更大的膽量比下線的更大的意味着上線更粗。

順便說一句,rect不一定是圖像的邊界。千萬不要假定它是,或者當它不是時,你會得到時髦的繪畫。假設它有一些界限 - 可能,但可能不是,整個事情。當你的意思是[self bounds],說[self bounds]

問題很可能是CGRectGetMidY([self bounds])CGRectGetMaxY([self bounds])之間的差異。一個包含一個分割一個像素的分數,而另一個分數是一個像素的倍數或接近它。 (不一定是視網膜顯示器1的倍數,1 pt = 2像素,因此1像素= 0.5 pt。)嘗試鋪設兩個數字並選擇性地添加0.5,並查看您更喜歡哪種方式。

沒有辦法讓它在0.6 pt的線條寬度下完美工作。沒有完整的像素數量。你所能做的就是制定出看起來最好的方案並做到這一點。

*寫在其他地方太乾,相反。

+0

感謝您的輸入。我寫這個問題的時候,我把這個大的形象換成了一個小小的人,好像做了這個工作。 http://i.imgur.com/KalTm.png - 如果有幫助。無論如何,我遇到的問題與我使用的點大小有關,我已將它提升到1.0,但即使在這種情況下也會出現同樣的問題。按照公認的答案,關閉反鋸齒技術就可以實現這一功能。 – JoeR 2010-11-19 23:56:53