2012-07-03 12 views
18

में drawRect ओवरराइड करते हैं तो मैं अपने UIScrolLView में drawRect को ओवरराइड करने का प्रयास कर रहा हूं, हालांकि यह मुझे मेरे UIScrollView के लिए निर्दिष्ट पृष्ठभूमि रंग की बजाय यह काला पृष्ठभूमि देता है। ऐसा क्यों है? अगर मैं drawRect कोड को दूर तो सब कुछ ठीक है:ब्लैक बैकग्राउंड जब 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

मुझे लगता है कि पृष्ठभूमि रंग संपत्ति बस एक CGContextAddRect और CGContextFillPath, लपेटता है जो यदि आप ऐसा ही कुछ कार्य करें: यह करने के लिए सबसे सही तरीका निम्नलिखित drawRect: टेम्पलेट का उपयोग करने के लिए है? –

+0

कुछ ऐसा क्या करते हैं? – xonegirlz

+0

ऊपर वर्णित दो कार्यों का उपयोग करके मैन्युअल रूप से bgcolor ड्राइंग। –

उत्तर

4

यह मदद करनी चाहिए

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

// सीमा और colorBack चुनें तदनुसार

+0

यूआईकिट को आवश्यक होने पर ड्राइंग अनुकूलित करने की अनुमति देने के लिए सीमाओं का उपयोग करें, सीमाओं का उपयोग करें। –

19

मुझे लगता है कि आप जो खोज रहे हैं:

myScrollViewInstance.opaque = NO 

उसके बाद आपके स्क्रॉल व्यू की पृष्ठभूमि अब काला नहीं होनी चाहिए।

+1

मैंने कोशिश की लेकिन मदद नहीं की। मुझे लगता है कि यह नहीं है कि पृष्ठभूमि काला है। केवल जब scrollView's drawRect ओवरराइड होता है, scrollView काला हो जाता है। यदि drawRect ओवरराइड नहीं किया गया है, तो स्क्रॉलव्यू सामान्य के रूप में सफेद है। – coolcool1994

+0

यह उत्तर केवल उस घटना में सही है जिसे आप वास्तव में अर्ध-पारदर्शी पृष्ठभूमि चाहते हैं। यदि आप एक गैर-स्पष्ट 'पृष्ठभूमि रंग' का सम्मान करने की अपेक्षा करते हैं तो यह असफल हो जाएगा। –

10

मैं अपने UIScrollView उपclass में drawRect ओवरराइड करते समय एक समान स्थिति में भाग गया।

, बस के साथ अधिभावी:

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

वांछित स्पष्ट पृष्ठभूमि मैं अधिभावी के बिना प्राप्त होता के बजाय एक काले रंग की पृष्ठभूमि में हुई।

मुझे पता चला क्योंकि यह दृश्य पृष्ठभूमि इंटरफ़ेस बिल्डर में डिफ़ॉल्ट पर सेट किया गया था और इसे Clear Color पर सेट करने से मेरे लिए समस्या हल हो गई।

मुझे यकीन नहीं है कि यह आपकी समस्या से संबंधित है लेकिन सोचा कि अगर मैं मदद कर सकता हूं तो मैं साझा करूंगा।

+1

UIView का 'drawRect:' को इस विधि के डिफ़ॉल्ट कार्यान्वयन के रूप में दस्तावेज किया गया है। ", इसलिए इसे निश्चित रूप से कॉल करना कुछ भी नहीं करेगा। आपको पृष्ठभूमि को स्वयं भरना होगा। –

-1

मेरे लिए काम करने वाली एकमात्र चीज setNeedsDisplay पर किसी भी कॉल के बाद पृष्ठभूमि को स्पष्ट रूप से सेट करना था। मेरे उदाहरण में, मैं UIScrollView की बजाय मानचित्र पर MKAnnotationView के उप-वर्ग का उपयोग कर रहा था, इसलिए मुझे वास्तव में पता नहीं है कि यह OP परिदृश्य पर कितनी अच्छी तरह लागू होता है। मेरे मामले में, मैं setNeedsDisplay को setAnnotation से कॉल कर रहा था, और मैंने पाया कि backgroundColor द्वारा ऐसा रीसेट कर रहा है। setNeedsDisplay के बाद बस backgroundColor द्वारा फिर से सेटिंग समस्या को हल करता है।

एफडब्ल्यूआईडब्ल्यू, मैंने यह भी देखा कि सुपर क्लास में प्रतिनिधि के लिए drawRect को ओवरराइड करने से यह काला पृष्ठभूमि समस्या उत्पन्न हुई।

4

के लिए मुझे

- (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

जवाब यहाँ बहुत स्पष्ट रूप से UIView के drawRect: विधि के लिए AppleDocs में प्रलेखित है यह अपने काम से प्रयास करें। पहला वाक्य है:

इस विधि का डिफ़ॉल्ट कार्यान्वयन कुछ भी नहीं करता है।

तो, सुपर कॉल करने के लिए यहां दिए गए सुझाव मदद नहीं करेंगे। जवाब के बाकी चर्चा में आगे नीचे निहित है:

... आपके विचार के अपारदर्शी संपत्ति हाँ के लिए, अपने drawRect सेट है, तो: विधि पूरी तरह से अपारदर्शी सामग्री के साथ निर्दिष्ट आयत भरना होगा।

मतलब यह है कि यदि आप पारदर्शी पृष्ठभूमि का इरादा नहीं रखते हैं, तो आपको वास्तव में पृष्ठभूमि को आकर्षित करने की आवश्यकता है।

- (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... 
}