2011-10-20 77 views
1

我有具有以下的drawRect方法自定義視圖中繪製一個矩形

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    float w = rect.size.width; 

    CGContextSetFillColorWithColor(ctx, [UIColor blackColor].CGColor); 
    CGContextAddArc(ctx, w/2, w/2, w/2 - 10, 0, 2 * M_PI, 0); 
    CGContextDrawPath(ctx, kCGPathFill); 

} 

我期待看到一個黑圈,但是,由於某種原因,它繪製一個黑色的矩形,而不是自定義視圖。我猜整個視圖正在充滿黑色。哪裏有問題?

回答

2

也許你的觀點的backgroundColor也是黑色的(它是不透明的觀點默認)?

此外,您不應該假設rect參數覆蓋整個視圖,它可能只是標記爲需要重繪的視圖的一部分。您應該將幾何計算基於視圖的bounds

+1

謝謝,加入'self.opaque = NO'似乎已經整理出來了 – georg

1

也許如果你把它剪裁成合適的尺寸?

CGContextClip(context); 

(你爲什麼不使用CGMutablePathRef BTW?)

+0

他錯過了一個超級調用或手動填充與視圖背景顏色的上下文,與裁剪無關。 –

+0

我對「CGMutablePathRef」沒有任何經驗,能否詳細說明它有什麼好處? – georg

+0

它很容易搜索到。但有了它,你可以很容易地繪製和存儲和重新創建形狀。你也可以很容易地分配linethickness,linecolor,填充和更多。 –

2

您需要添加....

[super drawRect:rect]; 

的第一線,那麼這將使後臺按照意見background屬性,或者如果你喜歡,你可以填充背景色的背景你自己,我更喜歡前者。

+0

謝謝!事實證明,我真的希望我的視圖的背景透明,因爲根據omz的回答 – georg

+0

您仍應該調用超級方法或基於設置的顏色處理繪圖,如果稍後(從透明)更改顏色,則會贏得'因爲你沒有遵循規則來正確覆蓋drawRect。只是戴着我的'合適'代碼帽子;) –

+0

調用'super'對'drawRect:'沒有任何影響,因爲默認實現[does nothing nothing](http://developer.apple.com/library/ios/documentation/uikit/)參考/ uiview_class/UIView的/ uiview.html#// apple_ref/OCC/instm/UIView的/的drawRect :)。 – omz