2010-01-24 9 views
46

मैं अभी भी CGContext के साथ एक रेखा खींचने के साथ संघर्ष कर रहा हूं। मैं वास्तव में आकर्षित करने के लिए लाइन पर जाता हूं, लेकिन अब मुझे पारदर्शी होने के लिए रेक्ट की पृष्ठभूमि की आवश्यकता है ताकि मौजूदा पृष्ठभूमि दिखाई दे। यहां मेरा टेस्ट कोड है:एक CGContext पारदर्शी पृष्ठभूमि सेट करना

(void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(context, [UIColor clearColor].CGColor); 
    CGContextSetAlpha(context,0.0); 
    CGContextFillRect(context, rect); 

    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); 
    CGContextSetLineWidth(context, 5.0); 
    CGContextMoveToPoint(context, 100.0,0.0); 
    CGContextAddLineToPoint(context,100.0, 100.0); 
    CGContextStrokePath(context); 
} 

कोई विचार?

उत्तर

70

UIGraphicsGetCurrentContext() के बाद कॉल CGContextClearRect(context,rect)

संपादित करें: ठीक है, यह मिल गया।

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

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextClearRect(context, rect); 
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); 
    CGContextSetLineWidth(context, 5.0); 
    CGContextMoveToPoint(context, 100.0,0.0); 
    CGContextAddLineToPoint(context,100.0, 100.0); 
    CGContextStrokePath(context); 
} 

मेरा परीक्षण एक बहुत ही बुनियादी UIViewController रूप में इस्तेमाल किया:

लाइन के साथ आपका कस्टम दृश्य निम्नलिखित होना चाहिए

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIImageView *v = [[UIImageView alloc] initWithFrame:self.view.bounds]; 
    [v setBackgroundColor:[UIColor redColor]]; 
    [self.view addSubview:v]; 
    TopView *t = [[TopView alloc] initWithFrame:self.view.bounds]; 
    [self.view addSubview:t]; 
    [v release]; 
    [t release]; 
} 
+7

पृष्ठभूमि काला है, आईफोन पृष्ठभूमि होना चाहिए। मैं वास्तव में एक UIView के शीर्ष पर आकर्षित करने की कोशिश कर रहा हूँ। –

+0

मैं काफी पालन नहीं करता हूं। क्या आप वाकई पर्यवेक्षण में UIView जोड़ चुके हैं? क्या UIView में यह drawRect है जिसे आप शीर्ष पर या किसी दूसरे में आकर्षित करना चाहते हैं? क्या आपने इस UIView के लिए गलती से पृष्ठभूमि रंग सेट किया था? –

+0

प्रश्नों के लिए धन्यवाद। मैं उम्मीद करता हूं कि आईएम ने यूवीव्यू को इसके पर्यवेक्षण में जोड़ा। रेखा आयताकार निश्चित रूप से दृश्य में है, क्योंकि रेखा ठीक से खींची गई थी। हां मैंने UIView में पृष्ठभूमि सेट की है, यह वह पृष्ठभूमि है जिसे मैं दिखाना चाहता हूं। मैं बस एक मौजूदा दृश्य के शीर्ष पर एक रेखा खींचने की कोशिश कर रहा हूं। सिएटल में निराश –

0

यहाँ प्रश्न को समझने में समस्या आ रही है, लेकिन अगर आप ' "पृष्ठभूमि" UIView को "शीर्ष" दृश्य के माध्यम से दिखाए जाने में असमर्थ हो, जिसमें आप चित्रित कर रहे हैं, एक समाधान topView.backgroundColor = [UIColor clearColor]; है, मुझे यह समस्या थी (मुझे लगता है) और यह मेरे लिए हल हो गया।

2
CGContextClearRect(context,rect) 

यदि प्रदान किया गया संदर्भ एक विंडो या बिटमैप संदर्भ है, तो क्वार्ट्ज प्रभावशाली ढंग से आयताकार को साफ़ करता है। अन्य संदर्भ प्रकारों के लिए, क्वार्ट्ज आयत को डिवाइस-निर्भर तरीके से भरता है। हालांकि, आपको इस फ़ंक्शन का उपयोग विंडो या बिटमैप संदर्भों के अलावा संदर्भों में नहीं करना चाहिए।

40

आसान तरीका:

- (id)initWithFrame:(CGRect)frame 
{ 
    if ((self = [super initWithFrame:frame])) 
    {  
     self.opaque = NO; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextClearRect(context, rect); 
    //your code 
} 
+4

मैं इसे तालिका दृश्य कक्ष में एक सहायक सूचक के लिए उपयोग कर रहा हूं। self.opaque = कोई काम नहीं करता है [स्वयं सेट बैकग्राउंड रंग: [UIColor clearcolor]] स्वीकृत उत्तर में नहीं है। –

+0

self.opaque = झूठी ने मुझे UICollectionViewCell – ae14

+1

का एक कस्टम उप दृश्य बनाते समय मेरी सहायता की, यह एक स्वीकार्य उत्तर होना चाहिए। self.opaque = NO drawRect, पारदर्शी का उपयोग करके दृश्य बनाता है। धन्यवाद! – Michael

3

मैं एक ही समस्या है, तो मैं यह है लगता है। मैं init को ओवरराइट करता हूं विधि -(id)initWithFrame:(CGRect)rect. इस विधि में self.background = [UIColor clearColor]; लेकिन मैं इस दृश्य का उपयोग xib फ़ाइल में करता हूं !!! वह इनिट विधि को कॉल करेगा

-(id)initWithCoder:(NSCoder*)aDecoder; 

तो सभी init को ओवरराइट करें विधि और सेटअप पृष्ठभूमि रंग ठीक काम करेगा।

+1

में भी काम करता है उपरोक्त में से कोई भी मेरे लिए काम नहीं करता है, भले ही यह xib में सेट है, बस इसे कोड कार्यों में सेट करें। +1 –

1

आप इस कोड के साथ एक छवि प्रसंग बना सकते हैं:

cacheContext = CGBitmapContextCreate (cacheBitmap, size.width, size.height, 8, bitmapBytesPerRow, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast); 
CGContextSetRGBFillColor(cacheContext, 0, 0, 0, 0); 
CGContextFillRect(cacheContext, (CGRect){CGPointZero, size}); 

कुंजी kCGImageAlphaPremultipliedLast है।

3

यह मेरे लिए एक यूआईएममेज के साथ काम करता है जिसे इंटरफ़ेसबिल्डर का उपयोग करके मैन्युअल रूप से जोड़ा गया था।

- (id)initWithCoder:(NSCoder *)aDecoder { 

    if(self = [super initWithCoder:aDecoder]) { 
     self.backgroundColor = [UIColor clearColor]; 
    } 

    return self; 
} 


-(void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext();  
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); 
    CGContextSetLineWidth(context, 5.0); 
    CGContextMoveToPoint(context, 100.0,0.0); 
    CGContextAddLineToPoint(context,100.0, 100.0); 
    CGContextStrokePath(context); 
} 

डेविड कनारेक का उत्तर केवल तभी काम करता है जब आप मैन्युअल रूप से अपना स्वयं का UIImageView बनाते हैं। यदि आपने यूआईवीव बनाया है और मैन्युअल रूप से इंटरफ़ेस बिल्डर के माध्यम से इसे जोड़ा है तो आपको इसके बजाय initWithCoder विधि को कॉल करने जैसे एक अलग दृष्टिकोण की आवश्यकता होगी।

0

opaque == false के साथ एक संदर्भ Init, स्विफ्ट 3

UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale) 

अपारदर्शी

एक बूलियन ध्वज यह बताते हैं कि बिटमैप अपारदर्शी है। यदि आप जानते हैं कि बिटमैप पूरी तरह से अपारदर्शी है, तो अल्फा चैनल को अनदेखा करने और बिटमैप के संग्रहण को अनुकूलित करने के लिए सही निर्दिष्ट करें। झूठी निर्दिष्ट करना मतलब है कि बिटमैप में आंशिक रूप से पारदर्शी पिक्सल को संभालने के लिए अल्फा चैनल शामिल होना चाहिए।

संबंधित मुद्दे