2012-07-03 17 views
18

Vì vậy, tôi đang cố gắng ghi đè drawRect trong UIScrolLView của mình, tuy nhiên nó mang lại cho tôi nền đen này thay vì màu nền mà tôi đã chỉ định cho UIScrollView của mình. Tại sao điều này? Nếu tôi loại bỏ mã drawRect sau đó mọi thứ đều tốt:nền đen khi ghi đè drawRect trong UIScrollView

- (void)drawRect:(CGRect)rect 
{ 
    [super drawRect:rect]; 
    if (shouldDrawVerticalLineForProfile){ 

     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGColorRef separatorColor = [UIColor colorWithRed:47.0/255.0 green:47.0/255.0 
                blue:47.0/255.0 alpha:1.0].CGColor; 

     // Add at bottom 
     CGPoint startPoint = CGPointMake(60, 0); 
     CGPoint endPoint = CGPointMake(60, 10000); 

     CGContextSaveGState(context); 
     CGContextSetLineCap(context, kCGLineCapSquare); 
     CGContextSetStrokeColorWithColor(context, separatorColor); 
     CGContextSetLineWidth(context, 5.0); 
     CGContextMoveToPoint(context, startPoint.x + 0.5, startPoint.y + 0.5); 
     CGContextAddLineToPoint(context, endPoint.x + 0.5, endPoint.y + 0.5); 
     CGContextStrokePath(context); 
     CGContextRestoreGState(context); 

    } 

} 
+0

Tôi nghĩ rằng tài sản backgroundColor chỉ đơn giản là kết thúc tốt đẹp một CGContextAddRect và CGContextFillPath, những gì nếu bạn làm điều gì đó như thế? –

+0

làm điều gì đó như thế nào? – xonegirlz

+0

vẽ bgcolor theo cách thủ công bằng hai chức năng tôi đã đề cập ở trên. –

Trả lời

4

Điều này sẽ giúp

CGContextSetFillColorWithColor(context, colorBack); 
CGContextFillRect(context, self.bounds); 

// Chọn giới hạn và colorBack phù

+0

Sử dụng trực tiếp, không giới hạn để cho phép UIKit tối ưu hóa bản vẽ khi cần. –

19

Tôi đoán những gì bạn đang tìm kiếm là:

myScrollViewInstance.opaque = NO 

Sau đó, nền của chế độ xem cuộn không được đen nữa.

+1

Tôi đã thử điều này nhưng không giúp được gì. Tôi nghĩ rằng nó không phải là nền đen. Chỉ khi drawRect của scrollView bị ghi đè, scrollView trở thành màu đen. Nếu drawRect không bị ghi đè, scrollview là màu trắng như bình thường. – coolcool1994

+0

Câu trả lời này chỉ đúng trong trường hợp bạn thực sự muốn có nền bán trong suốt. Nó sẽ thất bại nếu bạn mong đợi một 'backgroundColor' không rõ ràng để được tôn trọng. –

10

Tôi chạy vào một tình huống tương tự khi ghi đè drawRect trong lớp con UIScrollView của tôi.

Đơn giản chỉ cần trọng với:

- (void)drawRect:(CGRect)rect 
{ 
    [super drawRect:rect]; 
} 

dẫn đến một nền đen thay vì nền rõ ràng mong muốn Tôi muốn nhận được mà không trọng.

Tôi nhận thấy đó là vì Nền xem được đặt thành Mặc định trong Trình tạo giao diện và cài đặt nó thành Clear Color giải quyết vấn đề cho tôi.

Tôi không chắc liệu điều này có liên quan đến vấn đề của bạn hay không nhưng tôi nghĩ rằng tôi muốn chia sẻ trong trường hợp nó có thể hữu ích.

+1

'drawRect:' của UIView được ghi nhận là "Việc thực thi mặc định của phương thức này không làm gì cả.", Vì vậy hãy gọi nó là chắc chắn sẽ không làm gì cả. Bạn phải tự điền vào nền. –

-1

Điều duy nhất có hiệu quả đối với tôi là đặt rõ nền sau khi có bất kỳ cuộc gọi nào tới số setNeedsDisplay. Trong ví dụ của tôi, tôi đã sử dụng một lớp con của một MKAnnotationView trên bản đồ, thay vì UIScrollView, vì vậy tôi không thực sự biết mức độ áp dụng của trường hợp OP này. Trong trường hợp của tôi, tôi đã gọi số setNeedsDisplay từ setAnnotation và tôi nhận thấy rằng làm như vậy đặt lại theo số backgroundColor. Chỉ cần thiết lập lại bằng cách backgroundColor sau khi setNeedsDisplay khắc phục sự cố.

FWIW, tôi cũng quan sát thấy rằng chỉ cần ghi đè drawRect để ủy quyền cho lớp học cấp cao gây ra vấn đề nền đen này.

4

Vui lòng thử này làm việc của nó đối với tôi

- (id)initWithFrame:(CGRect)frame { 
     if (self = [super initWithFrame:frame]) { 
      [self setBackgroundColor:[UIColor clearColor]]; 
     } 
     return self; 
    } 
    - (void)drawRect:(CGRect)rect 
    { 
     [super drawRect:rect]; 
     if (shouldDrawVerticalLineForProfile){ 

      CGContextRef context = UIGraphicsGetCurrentContext(); 
      CGColorRef separatorColor = [UIColor colorWithRed:47.0/255.0 green:47.0/255.0 
                 blue:47.0/255.0 alpha:1.0].CGColor; 

      // Add at bottom 
      CGPoint startPoint = CGPointMake(60, 0); 
      CGPoint endPoint = CGPointMake(60, 10000); 

      CGContextSaveGState(context); 
      CGContextSetLineCap(context, kCGLineCapSquare); 
      CGContextSetStrokeColorWithColor(context, separatorColor); 
      CGContextSetLineWidth(context, 5.0); 
      CGContextMoveToPoint(context, startPoint.x + 0.5, startPoint.y + 0.5); 
      CGContextAddLineToPoint(context, endPoint.x + 0.5, endPoint.y + 0.5); 
      CGContextStrokePath(context); 
      CGContextRestoreGState(context); 

     } 

    } 
4

Câu trả lời ở đây là tài liệu rất rõ trong AppleDocs cho phương pháp drawRect: UIView của. Câu đầu tiên là:

Việc triển khai mặc định của phương pháp này không có gì.

Vì vậy, các đề xuất ở đây để gọi siêu sẽ không giúp ích gì. Phần còn lại của câu trả lời được chứa thêm trong phần thảo luận:

... nếu thuộc tính mờ của chế độ xem của bạn được đặt thành CÓ, phương thức drawRect: của bạn phải điền đầy đủ hình chữ nhật được chỉ định với nội dung mờ.

Có nghĩa là nếu bạn không có ý định nền trong suốt, bạn cần vẽ nền. Cách đúng nhất để làm điều này là sử dụng drawRect: mẫu sau:

- (void)drawRect:(CGRect)rect 
{ 
    [super drawRect:rect]; // optional if a direct UIView-subclass, should be called otherwise. 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    // Fill the background color, if needed 
    if (self.opaque) { 
     UIGraphicsPushContext(context); 
     CGContextSetFillColorWithColor(context, self.backgroundColor.CGColor); 
     CGContextFillRect(context, rect); 
     UIGraphicsPopContext(); 
    } 

    // Your code here... 
} 
Các vấn đề liên quan