2010-04-10 15 views
38

के मेरे उप-वर्ग में drawRect नहीं कहा जा रहा है मैंने UIImageView को उपclassed है और drawRect को ओवरराइड करने का प्रयास किया है, इसलिए मैं क्वार्ट्ज 2 डी का उपयोग कर छवि के शीर्ष पर आकर्षित कर सकता हूं। मुझे पता है कि यह एक बेवकूफ नौसिखिया सवाल है, लेकिन मैं नहीं देख रहा कि मैंने क्या गलत किया है।UIImageView

#import <UIKit/UIKit.h> 

@interface UIImageViewCustom : UIImageView { 

} 
- (void)drawRect:(CGRect)rect; 
@end 

और कार्यान्वयन: यहां इंटरफ़ेस है

#import "UIImageViewCustom.h" 

@implementation UIImageViewCustom 

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

- (void)drawRect:(CGRect)rect { 
    // do stuff 
} 

- (void)dealloc { 
    [super dealloc]; 
} 
@end 

मैं drawRect पर एक ब्रेकपाइंट सेट और यह हिट कभी नहीं, मुझे अग्रणी यह ​​बिल्कुल कहा जाता हो जाता है कभी नहीं लगता है। क्या पहली बार दृश्य लोड होने पर इसे बुलाया जाना चाहिए? क्या मैंने गलत तरीके से इसे ओवरराइड किया है?

+0

कृपया अपडेट किए गए उत्तर को देखें, आपको दोबारा परेशान करने के लिए खेद है। –

+0

ठीक है। प्रलेखन के माध्यम से मैंने देखा कि यह काम करेगा यदि आप UIIMageView के बजाय UIView का उप-वर्ग बनाते हैं, तो अब आप अपने सबक्लास में UIImageView के गुण जोड़ सकते हैं, मैंने इसे अपने टेबलव्यू कक्षों की पृष्ठभूमि खींचने के लिए एक बार किया था, अधिक जानकारी के लिए आप at.http: //stackoverflow.com/questions/1784827/draw-a-custom-cell-for-tableview-uitableview-with-changed-colors-and-separa –

उत्तर

80

यह केवल तभी दिखाई देगा जब दृश्य दृश्यमान और गंदा हो। हो सकता है कि समस्या उस कोड में है जो दृश्य बनाता है, या आपके निब में, अगर आप इसे बना रहे हैं?

यदि आप "रिलीज़" निर्माण को डीबग करने का प्रयास कर रहे हैं तो आप कभी-कभी सेट अप करने में विफल होने वाले ब्रेकपॉइंट्स को भी देखेंगे।


मुझे पहली बार याद आया कि आप UIImageView subclassing कर रहे हैं। डॉक्स से:

विशेष ध्यान

UIImageView वर्ग के लिए अनुकूलित है प्रदर्शित करने के लिए अपनी छवियों आकर्षित। UIImageView drawRect को कॉल नहीं करेगा: सबक्लास में। यदि आपके उप-वर्ग को कस्टम ड्राइंग कोड की आवश्यकता है, तो की अनुशंसा की जाती है कि आप बेस क्लास के रूप में UIView का उपयोग करें।

तो आपके पास यह है। यह देखते हुए कि [UIImage drawInRect:] का उपयोग करके किसी छवि को चित्रित करना कितना आसान है, या कैलियर का उपयोग करके, संभवतः UIImageView को उपclass करने का कोई अच्छा कारण नहीं है।

+0

नहीं खींचना चाहिए जब दृश्य पहले होता है प्रस्तुत किया, यद्यपि? –

+0

असल में, अब आप इसका जिक्र करते हैं, मुझे यह याद रखना याद है। पता नहीं क्यों मैं इसे खोज रहा था जब मैं इसे फिर से नहीं मिला। धन्यवाद। –

+1

'UIImageView' यदि आप आईबी के साथ काम करना चाहते हैं तो उपclass में सक्षम होने के लिए एक बड़ी बात है। आह ... उत्तर के लिए धन्यवाद, यह मदद करता है। –

0

नहीं सीधे अपने सवाल का जवाब है, लेकिन आपकी समस्या का समाधान हो सकता है:

क्यों UIImageView का एक उपवर्ग के साथ ऐसा? सबक्लासिंग हमेशा समस्याग्रस्त हो सकती है, खासतौर से उन वर्गों के लिए जिन्हें उप-वर्गीकृत करने के लिए डिज़ाइन नहीं किया गया है - और मैं शर्त लगाता हूं कि UIImageView नहीं है। यदि आप किसी छवि के शीर्ष पर सामान खींचना चाहते हैं, तो पारदर्शी पृष्ठभूमि के साथ एक दृश्य बनाएं, जो भी आप चाहते हैं उसे खींचें, और इसे सीधे छवि पर रखें।

+1

ठीक है, ठीक है, मैंने इसे प्रलेखन में देखा और स्पष्ट रूप से यह सबक्लासिंग ठीक है। मुझे अभी भी संदेह है कि यह लक्ष्य पूरा करने का सबसे अच्छा तरीका नहीं है। – jasoncrawford

1

जोड़ने के लिए

संपादित करें का प्रयास करें:

- (id)initWithFrame:(CGRect)frame{ 
    if (self = [super initWithFrame:frame]) { 
     [self setClearsContextBeforeDrawing:YES];//add this line also 
    } 
    return self; 
} 


- (void)setNeedsDisplay{ 
    [self setNeedsDisplayInRect:self.frame]; 
} 

अपने कोड में।

उम्मीद है कि इससे मदद मिलती है।

धन्यवाद,

मधुप

+0

सुझाव के लिए धन्यवाद, लेकिन यह भी काम नहीं करता है :-( –

+0

अपडेट या तो काम नहीं किया। –

+0

clearsContextBeforeDrawing डिफ़ॉल्ट रूप से हाँ है! – daveoncode

0

ओवरराइड करने के लिए उपयोग नहीं कर सकते अपने विशिष्ट मामले के आधार पर, यह भावना एक के बजाय एक पृष्ठभूमि छवि के साथ एक UIButton उपयोग करने के लिए कर सकता है UIImageView।आप userInteractionEnabled को भी सेट कर सकते हैं और परिणाम UIImageView से अलग नहीं होगा।

इस मामले में अपने UIButton उपवर्ग बस में शामिल हैं:

- (void)drawRect:(CGRect)rect 
{ 
    if (kSomethingSpecial) { 
    [self setBackgroundImage:[UIImage imageNamed:@"RedBackground.png"] 
        forState:UIControlStateNormal]; 
    } 
} 

अस्वीकरण - मैं केवल इस सिफारिश करेंगे अगर आप एक बटन के रूप में छवि का उपयोग करने के लिए समय की कम से कम कुछ योजना है। UIImageView में इस ड्रॉक्ट व्यवहार के लिए वर्कअराउंड के रूप में मैं UIButton का उपयोग करके पूरी तरह से समर्थन नहीं कर सकता, क्योंकि मुझे यकीन है कि ऐप्पल के पास उनके एपीआई को लिखने के कारण हैं, जैसे कि मार्क संदर्भित।