#CGContextRef
之前在項目中遇到畫凹型View,代碼如下:
(void)drawRect:(CGRect)rect {
floatx = rect.origin.x;
floaty = rect.origin.y;
floatw = rect.size.width;
floath = rect.size.height;
CGContextRef context = UIGraphicsGetCurrentContext();
//設置繪製的顏色
CGContextSetRGBStrokeColor(context,1,0,0,0);
//設置繪製直線、邊框時的線條寬度
CGContextSetLineWidth(context, 1.0);
if (_arcViewColor) {
//設置繪製的view的顏色
CGContextSetFillColorWithColor(context, _arcViewColor.CGColor);
}else{
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
}
// 開始一個新的子路徑點
CGContextMoveToPoint(context,x,y);
// 添加一條直線段從當前指向的(x,y)。
CGContextAddLineToPoint(context,x,h);
CGContextAddLineToPoint(context,w,h);
CGContextAddLineToPoint(context,w,y);
CGContextAddLineToPoint(context,w,y);
CGContextAddLineToPoint(context,w/2,h);
CGContextAddLineToPoint(context,x,y);
//使用指定模式繪製當前CGContextRef中所包含的路徑,
//void CGContextDrawPath(CGContextRef__nullable c, CGPathDrawingMode mode)
/**
typedef CF_ENUM (int32_t, CGPathDrawingMode) {
kCGPathFill,//只有填充(非零纏繞數填充),不繪製邊框
kCGPathEOFill,//奇偶規則填充(多條路徑交叉時,奇數交叉填充,偶交叉不填充)
kCGPathStroke, // 只有邊框
kCGPathFillStroke, // 既有邊框又有填充
kCGPathEOFillStroke // 奇偶填充並繪製邊框
};
**/
CGContextDrawPath(context, kCGPathFillStroke);
}
問題:自定義的繪製View圖形有時候顯示不出來
原因: 在需要隱藏view時,爲當前的view設置height爲0,當View的size爲0時,繪製view時是不會走drawRect方法的。所以在剛進入時爲空數據,再轉爲有數據時,當前的view 不會走drawRect。
DrawRect調用時機
- 如果在UIView初始化時沒有設置rect大小,將直接導致drawRect不被自動調用。
drawRect 調用是在Controller->loadView, Controller->viewDidLoad 兩方法之後掉用的.所以不用擔心在 控制器中,這些View的drawRect就開始畫了.這樣可以在控制器中設置一些值給View(如果這些View draw的時候需要用到某些變量 值). - 該方法在調用sizeToFit後被調用,所以可以先調用sizeToFit計算出size。然後系統自動調用drawRect:方法。
- 通過設置contentMode屬性值爲UIViewContentModeRedraw。那麼將在每次設置或更改frame的時候自動調用drawRect:。
- 直接調用setNeedsDisplay,或者setNeedsDisplayInRect:觸發drawRect:,但是有個前提條件是rect不能爲0