2012-10-10 64 views
0

我一直在尋找解決方案,但無法弄清楚是否可以做到以下幾點:用的drawRect方法繪製 - 可可

我有一個方法的drawRect,我想要做的就是添加一個圖形元素(例如rects和lines)到當前視圖而不刷新它。我曾經調用setNeedsDisplay,但這種方法實際上是刪除myView重新從0繪製它..任何建議,以保持舊的和添加新的內容?

謝謝

回答

0

這就是drawRect:它 - 它重繪視圖中的矩形。

如果您想在上面繪製線條和rects,請嘗試在不同的圖層上進行繪製。

1

每次在視圖中進行更新時,它的整體都會重新繪製;所以-drawRect需要重繪整個視圖。你必須「刷新」你的觀點 - 這是常態 - 它沒有錯。只需再次繪製舊內容。或者,如果您只想重新繪製視圖的特定部分,則可以調用setNeedsDisplayInRect:

+0

是的,但是如何「保存」舊內容的某個地方,以便稍後用其他形狀或內容重新繪製它? –

0

我想如果使用圖層,效果會更好。 您可以爲您的形狀製作CALayer子類,然後將它們保存在一個數組中。

0

默認情況下,drawRect方法會清除整個內容,如果你想動態地將一些新的圖形內容繪製到視圖中,你應該抽象這些圖形元素的數據結構,例如,你添加一行,這一行將會有

 
     a start point 
     a end point 
     line color 
     line width 
     is has a shadow 
     a line join

,所以你可以把所有這些財產成一個結構,定義名爲LineStruct一個新的數據類和定義一個名爲

-(void)drawLine:(CGContextRef)ctx withLineStruct:(LineStruct*)lineStruct 

您自定義的UIView方法,定義一個

@property(nonatomic)LineStruct * lineStruct;

,並調用它的drawRect方法

-(void)drawRect:(CGContextRef)ctx{ 
     CGContextRef ctx = UIGraphicsGetCurrentContext() ; 
     [self drawLine:ctx withLineStruct:self.lineStruct]; 
    } 

因此,如果您有其他圖形的內容,你可以做這樣的抽獎。如果你有很多 的內容,你必須添加一個緩衝區到你的UIView,比如添加一個NSArray,並且在drawRect方法中,你添加一個for(;;)來繪製所有的圖形元素

0

我想也許你需要類似NSBezierPath的東西來存儲所有的形狀並添加新的形狀。將新形狀添加到現有的NSBezierPath中很容易,請參閱文檔:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSBezierPath_Class/Reference/Reference.html 然後在您的drawrect中,您只需要描邊或填充NSBezierPath。

只有當您的所有形狀具有相同的填充顏色和描邊時,此功能纔有效。否則,你可以保留多種NSBezierPaths的列表,並以不同的方式填充/填充它們。

0

您可以通過將視圖與原始iboutlet分開繪製到視圖中來「解決」這個問題。然後讓你的主視圖背景透明(但不要讓iboutlets透明)。所以對於這個例子,我會阻止你想保留的IBOutlets(不是繪製)是一個UITextField,一個UILabel和一個UIButton。 所以你Interface Builder中看起來就像這樣:

UIVIewController 
    UIView2 (view with drawRect defined) 
    UIView (main) 
    UITextField 
    UILabel 
    UIButton 

所以你看,當你調用「的drawRect」它仍然會空出你的UIView2完全,但它並不重要,因爲「的drawRect」不會刪除UILabel,UIButton,UITextField或任何你想保留在你的UIView1中的任何東西。希望這可以幫助。

相關問題