我一直在尋找解決方案,但無法弄清楚是否可以做到以下幾點:用的drawRect方法繪製 - 可可
我有一個方法的drawRect,我想要做的就是添加一個圖形元素(例如rects和lines)到當前視圖而不刷新它。我曾經調用setNeedsDisplay,但這種方法實際上是刪除myView重新從0繪製它..任何建議,以保持舊的和添加新的內容?
謝謝
我一直在尋找解決方案,但無法弄清楚是否可以做到以下幾點:用的drawRect方法繪製 - 可可
我有一個方法的drawRect,我想要做的就是添加一個圖形元素(例如rects和lines)到當前視圖而不刷新它。我曾經調用setNeedsDisplay,但這種方法實際上是刪除myView重新從0繪製它..任何建議,以保持舊的和添加新的內容?
謝謝
這就是drawRect:它 - 它重繪視圖中的矩形。
如果您想在上面繪製線條和rects,請嘗試在不同的圖層上進行繪製。
每次在視圖中進行更新時,它的整體都會重新繪製;所以-drawRect需要重繪整個視圖。你必須「刷新」你的觀點 - 這是常態 - 它沒有錯。只需再次繪製舊內容。或者,如果您只想重新繪製視圖的特定部分,則可以調用setNeedsDisplayInRect:
。
我想如果使用圖層,效果會更好。 您可以爲您的形狀製作CALayer子類,然後將它們保存在一個數組中。
默認情況下,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(;;)來繪製所有的圖形元素
我想也許你需要類似NSBezierPath的東西來存儲所有的形狀並添加新的形狀。將新形狀添加到現有的NSBezierPath中很容易,請參閱文檔:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSBezierPath_Class/Reference/Reference.html 然後在您的drawrect中,您只需要描邊或填充NSBezierPath。
只有當您的所有形狀具有相同的填充顏色和描邊時,此功能纔有效。否則,你可以保留多種NSBezierPaths的列表,並以不同的方式填充/填充它們。
您可以通過將視圖與原始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中的任何東西。希望這可以幫助。
是的,但是如何「保存」舊內容的某個地方,以便稍後用其他形狀或內容重新繪製它? –