2012-10-17 53 views
6

我的應用程序能夠做一些簡單的圖形繪製(直到我得到一個更穩定的代碼,我堅持只有一個數字),它也能夠重新調整它們的大小。我用它來創建一個UIView的代碼如下:UIView繪圖的最佳實踐

- (void)drawRect:(CGRect)rect 
{  
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    [self setContextFillColor:context]; 
    [self setContextStrokeColor:context]; 
    [self setLineWidth:context]; 

    CGFloat lineThickness = [self lineWidth] ; 
    CGFloat halfLineThickess = lineThickness/2.0f; 

    CGContextAddRect(context, CGRectMake(halfLineThickess,halfLineThickess, rect.size.width - lineThickness, rect.size.height - lineThickness)); 

    CGContextDrawPath(context, kCGPathEOFillStroke); 
} 

這給了我,用(100.0f,100.0f)的輸入尺寸,這樣的:

enter image description here

這個數字是在「容器」UIView內部,其在UIScrollView內。我的問題是當我重新調整圖形尺寸並達到大約1000 * 1000(我的「容器」是20,000 * 20,000)時,我開始接收內存警告,應用程序最終放棄。所以我的問題是:

1)我應該考慮把最大尺寸爲UIView? 2)我怎樣才能使用這些工具來跟蹤這類問題,並且看看問題出現在哪裏(或者在哪裏進行繁重的工作)。

3)我應該使用某種緩存,如this

4)是否有一些通用的最佳實踐要考慮,當繪製一個UIView

5)我是否應該考慮CALayer,雖然我需要傾聽觸動?

UIView的重新調整大多基於this

+0

你有沒有考慮過使用QuartzCore,只是使用視圖的圖層屬性來繪製邊框? – runmad

+0

事情是:這是一個簡單的數字。最後我會有更復雜的,我不認爲玩'UIView'的屬性就足夠了。但謝謝你的建議。 – Peres

+2

如果您需要繪製大型內容(可能是縮放),您可能需要檢查'CATiledLayer' http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html – Bastian

回答

1

你不應該創建一個UIView這麼大。它太大了。這種問題是CATiledLayer旨在解決的問題。基本上你需要跟蹤你的形狀的邊界框,並使用這些邊界框來確定哪些圖塊相交哪些形狀。當系統要求給定的圖塊時,然後繪製與之相交的所有圖形。對於非常大而複雜的形狀,您可以通過分割形狀進一步優化,但通常不需要。

1

1)我認爲這個大小,如果你使用正確的方法,這不是一個問題。

2)您應該使用儀器來看看WWDC影片關於跟蹤內存問題

3,4)我認爲- (void)drawRect:(CGRect)rect這不是一個好的做法。如果你會看圖CALayer會更好。您可以使用自定義CGMutablePathRef進行繪製。

所以UIView很適合處理觸摸,但不適合繪製形狀。

+0

我也想處理那個'UIView'上的手勢(如移動和調整大小)。 – Peres

+0

@JackyBoy這不是這裏的一個問題是一些步驟: 1)創建新的視圖 '的UIView * view' 2)創建新的層 '的CALayer * shapeLayer view.layer = shapeLayer' 3)添加手勢 '[查看addGestureRecognizer:panGesture];' – Danil