CGContextRef畫view及遇到的Bug

#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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章