2012-04-17 12 views
11

के लिए मैं बनाने के लिए & गोलाकार कोनों के साथ एक आयत के लिए एक बहुत ही सरल UIView उपवर्ग का उपयोग कोशिश कर रहा हूँ बनाएँ।आईओएस - UIView उपवर्ग गोलाकार आयत

RoundedRect.h

#import <UIKit/UIKit.h> 
#import <QuartzCore/QuartzCore.h> 

@interface RoundedRect : UIView 
@end 

RoundedRect.m

#import "RoundedRect.h" 

@implementation RoundedRect 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     [[self layer] setCornerRadius:10.0f]; 
     [[self layer] setMasksToBounds:YES]; 
    } 
    return self; 
} 
@end 

मैं स्टोरीबोर्ड के साथ आईओएस 5.1 उपयोग कर रहा हूँ और में कस्टम वर्ग संपत्ति की स्थापना की है: मैं एक नया वर्ग इस प्रकार बना लिया है आईबी इंस्पेक्टर विंडो 'RoundedRect' के लिए, लेकिन जब मैं ऐप चलाता हूं तो आयत में अभी भी स्क्वायर कोनों हैं। क्या मुझे कुछ स्पष्ट याद आया है?

धन्यवाद जोनाथन

उत्तर

9

जब दृश्य एक XIB फ़ाइल से instantiated है initWithFrame विधि कहा जाता है नहीं है। इसके बजाय, initWithCoder: प्रारंभकर्ता कहा जाता है, इसलिए आपको इस विधि में समान प्रारंभ करने की आवश्यकता है।

+0

बहुत धन्यवाद का उपयोग करना चाहिए, तो है कि चाल किया है! –

+0

मैं '-awakeFromNib' में अतिरिक्त सेटअप करता हूं। क्या इसके साथ कोई समस्या है? – d11wtq

+1

अंतर यह है कि XIB से सभी ऑब्जेक्ट्स लोड होने के बाद 'awakeFromNib' भेजा जाता है। यह वांछित हो सकता है या नहीं भी हो सकता है, और मुझे लगता है कि कई मामलों में इससे कोई फर्क नहीं पड़ता। – Krumelur

3

बार देखा गया है कि एक निब फ़ाइल से लोड किए गए हैं के लिए, नामित प्रारंभकर्ता initWithCoder: है। इस मामले में initWithFame: नहीं कहा जाता है।

17

अन्य लोग पहले से ही सवाल का जवाब दे दिया है, लेकिन मैं इसे refactor होगा इस महत्वपूर्ण व्यक्ति में और कोड में उपयोग सक्षम करने के लिए की तरह

#import "RoundedRect.h" 

@implementation RoundedRect 

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

- (id)initWithCoder:(NSCoder *)aDecoder; 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     [self commonInit]; 
    } 
    return self; 
} 

- (void)commonInit; 
{ 
    CALayer *layer = self.layer; 
    layer.cornerRadius = 10.0f; 
    layer.masksToBounds = YES; 
} 

@end 
22

iOS 5 में और ऊपर, वहाँ बिल्कुल उपवर्ग करने की कोई जरूरत नहीं है - आप कर सकते हैं इंटरफेस बिल्डर से यह सब करो।

  1. उस यूआईवीव का चयन करें जिसे आप संशोधित करना चाहते हैं।
  2. पहचान निरीक्षक पर जाएं।
  3. "उपयोगकर्ता परिभाषित & रनटाइम विशेषताएँ" में, कुंजी पथ में "layer.cornerRadius" जोड़ें, प्रकार "संख्या" होना चाहिए और जो भी सेटिंग आपको चाहिए।
  4. भी 'layer.masksToBounds' को बूलियन के रूप में जोड़ें।
  5. हो गया! बिना subclassing, और सभी आईबी में।
0

नोक से UIView लोड, आप विधि

- (void)awakeFromNib 
संबंधित मुद्दे