首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS UIView 繪圖背景顏色設置:透明或白色背景實現

     編輯:程式設計綜合問答

問題

自定義 UIView 子類在 drawRect: 中繪製文本,背景呈現黑色,需改為透明或白色。

原因

UIView 默認背景色為透明 (clearColor),但若父視圖背景為黑、或繪圖上下文未清理、或未設置 opaque = NO,可能顯示為黑色。此外 drawRect: 中未繪製背景時,顯示的是父視圖內容或未定義內容。

解決方案:設置背景色屬性

在初始化方法中設置:


- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // 方案 1:透明背景 (默認,但顯式設置更清晰)
        self.backgroundColor = [UIColor clearColor];
        // 關鍵:告訴系統視圖非不透明,允許混合
        self.opaque = NO; 
        
        // 方案 2:白色背景
        // self.backgroundColor = [UIColor whiteColor];
        // self.opaque = YES; // 不透明可優化性能
    }
    return self;
}

在 drawRect: 中繪製背景 (可選,更可控)


- (void)drawRect:(CGRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 1. 繪製背景 (白色或透明)
    // 透明:不需填充,但需確保 opaque=NO
    // 白色:
    [[UIColor whiteColor] setFill];
    UIRectFill(rect); // 填充整個 rect
    
    // 2. 繪製文本/其他內容
    // ...
}

關鍵屬性對照

屬性值效果
backgroundColor[UIColor clearColor]透明,顯示父視圖內容
backgroundColor[UIColor whiteColor]白色實心背景
opaqueNO (默認)允許透明混合,**透明背景必須設置**
opaqueYES聲明視圖完全不透明,系統優化繪製 (不混合)
clearsContextBeforeDrawYES (默認)每次 drawRect 前自動清空上下文 (填充背景色)

常見坑點

  • 未設置 opaque = NO:透明背景視圖默認 opaque=YES 時,系統不進行混合,直接顯示未初始化的顯存內容 (常為黑色)。
  • 父視圖背景為黑:檢查父視圖 backgroundColor。
  • 在 drawRect 中手動填充背景:若設置了 backgroundColor 且 clearsContextBeforeDraw=YES,系統會自動填充,手動再填一次雖無害但多餘。

總結

**設置 self.backgroundColor = [UIColor clearColor]; self.opaque = NO;** 即可獲得透明背景。若需白色背景,設置 whiteColor 並 opaque = YES 以獲取性能優化。在 drawRect: 中專注繪製前景內容,背景交給屬性系統管理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved