2013-08-01 5 views
12

मैं कुछ यूआईएलएबल के साथ एक बहुत ही सरल कस्टम व्यू बनाना चाहता हूं, मुझे यह कैसे करना चाहिए। किसी भी ट्यूटोरियल या सुझाव की सराहना की जाएगी। मैं इसके लिए नया हूं, पहले कोशिश नहीं की।मैं एक कस्टम व्यू क्लास प्रोग्रामेटिक रूप से कैसे बना सकता हूं?

मैंने xib के साथ यह कोशिश की।

@interface MyCustomView : UIView 

@property (strong, nonatomic) IBOutlet UILabel *Label; 

@end 

कार्यान्वयन

#import "MyCustomTimer.h" 
@implementation MyCustomView 
-(id)initWithCoder:(NSCoder *)aDecoder{ 
     if ((self = [super initWithCoder:aDecoder])){ 
     [self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self  options:nil] objectAtIndex:0]]; 
     } 
    return self; 
} 
@end 

लेकिन मैं यह प्रोग्राम के रूप में करने की जरूरत है, मदद करें। धन्यवाद

+3

यह प्रश्न यहां एक साधारण क्यूए प्रश्न के लिए बहुत व्यापक है। उपरोक्त पुस्तक के माध्यम से जाओ जो प्रोग्रामेटिक रूप से सबकुछ शामिल करता है। – bryanmac

+0

किसी भी बुनियादी शिक्षण पुस्तक के माध्यम से जाओ। यह सबसे बुनियादी बात है – iProgrammer

+0

@Ezimettekin आप पहले से मौजूद वर्ग में कस्टम दृश्य बनाना चाहते हैं या आप nib फ़ाइल – Vishnu

उत्तर

28

यहाँ एक आसान तरीका है, यह ज आशा आपको elps

//in subclassed UIView 
#import "CustomView.h" 
@implementation CustomView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
    // Initialization code 
    // initilize all your UIView components 
    UILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(20,30, 200, 44)]; 
    label1.text = @"i am label 1"; 
    [self addSubview:label1]; //add label1 to your custom view 

    UILabel *label2 = [[UILabel alloc]initWithFrame:CGRectMake(20,80, 200, 44)]; 
    label2.text = @"i am label 2"; 
    [self addSubview:label2]; //add label2 to your custom view 



    [label1 release];//i am using without ARC, comment if u are using ARC 
    [label2 release];//i am using without ARC, comment if u are using ARC 
    } 
    return self; 
    } 



    // in your class where u want to use that view 
    #import "ViewController.h" 
    #import "CustomView.h"//import it 

    @interface ViewController() 

    @end 

    @implementation ViewController 

- (void)viewDidLoad 
    { 
    [super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
    //create your view where u want 
    CustomView *cv = [[CustomView alloc]initWithFrame:CGRectMake(10, 10, 230, 400)]; //create an instance of your custom view 
    [self.view addSubview:cv]; // add to your main view 
    [cv release];//comment if u are using ARC 
} 


3

अद्यतन initWithFrame: के साथ-साथ initWithCoder: लागू करने के लिए अपनी कक्षा, तो आप कॉल कर सकते हैं:

[[MyCustomView alloc] initWithFrame:...]; 

अपने कोड में। इस प्रकार आपने प्रोग्रामेटिक रूप से एक उदाहरण (जिसे कॉन्फ़िगर किया गया है) बनाया है।

- (id)initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 
     UILabel *label = [[UILabel alloc] initWithFrame:...]; 
     // configure the label 
     [self addSubview:label]; 
    } 
return self; 
} 
+0

के साथ एक UIView क्लास बनाना चाहते हैं, अगर मैं गलत हूं तो कृपया मुझे सही करें: 1. यदि मैं एक कस्टम बनाना चाहता हूं देखें कि इसकी * चौड़ाई * अपने सुपरव्यू के सापेक्ष होने वाली है, तो कस्टम व्यू क्लास में कोई मैनिपुलेशन (पर्यवेक्षण से संबंधित) नहीं किया जा सकता है। बाधाएं केवल तभी की जा सकती हैं जब इसे वास्तव में सुपरव्यू में जोड़ा जाता है। 2. यदि मैं नहीं चाहता कि इसकी चौड़ाई रिश्तेदार हो तो मैं बस इसे एक निश्चित फ्रेम, या स्क्रीन आकार 3 के आधार पर कुछ भी कर सकता हूं। कस्टम व्यू में मैं सबव्यूज़ (लेबल, टेक्स्टफिल्ड इत्यादि) में सक्षम हूं। और उनके बाधाओं को कस्टम व्यू – Honey

+0

@ हनी आमतौर पर इतना आसान नहीं है। विचारों में आमतौर पर उनके ऑटोरेसाइजिंग मास्क को बाधाओं में परिवर्तित किया जाता है, इसलिए यह निर्भर करता है कि यह कैसे कॉन्फ़िगर किया गया है। आप लेआउट सबव्यूव्स का उपयोग भी कर सकते हैं और लागू नियमों को अपडेट करने के लिए बाधाओं को अपडेट कर सकते हैं ... – Wain

+0

मुझे यकीन नहीं है कि मैं आपको समझता हूं ... मैं आखिरकार पूछ रहा हूं कि क्या एक वर्ग इसके फ्रेम/बाधाओं को सापेक्ष सेट कर सकता है यह अपनी खुद की कक्षा से सुपरव्यू है? या यह हमेशा superView से होना है? – Honey

2

आप अपने initWithFrame में इन पंक्तियों जगह कर सकते हैं:

self = [super initWithFrame:frame] 
if (self!=null) { 
// if self has been allocated 

UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(10, 100, 300, 40)]; 
[label setText:@"Label"]; 
[label setTextAlignment:NSTextAlignmentJustified]; 
[self addSubview:label]; 
} 

यह एक बहुत ही सरल उदाहरण .. सिर्फ एक लेबल जोड़ने के लिए आप अपने वांछित स्थानों के साथ के रूप में कई वस्तुओं आप प्रोग्राम के लिए चाहते हैं .. जोड़ सकते हैं और फ्रेम आकारों और जो कुछ गुण आप चाहते हैं ...

शायद आप खोज की है चाहिए "UILabel प्रोग्राम के ..

+0

डबल बराबर? (==) – ruandao

5

आप कहते हैं कि आप एक XIB का उपयोग नहीं करना चाहते हैं और यह सभी प्रोग्राम के रूप में करना चाहते हैं।

- (id)initWithFrame:(CGRect)frame 
{ 
    if ((self = [super initWithFrame:frame])) { 
     // create/initialize your subviews here 
     self.myLabel = [[UILabel alloc] init...]; 

     // configure the label 
     self.myLabel.font = ...; 
     self.myLabel.autoresizingMask = ...; 

     [self addSubview:self.myLabel]; 
    } 

    return self; 
} 

तो जब आप अपना नियंत्रण कॉन्फ़िगर (फ़ॉन्ट, रंग, मास्क autoresizing आदि) और उन्हें subviews के रूप में जोड़ने के लिए, सभी initWithFrame: विधि से:

आप initWithFrame: विधि को लागू करने की जरूरत है। चीजों को साफ रखने के लिए आप शायद अलग-अलग तरीकों से कोड को तोड़ना चाहते हैं।

यदि आप ऑटोलायआउट का उपयोग कर रहे हैं, तो आप इन सभी विधियों को इनिट विधि से भी बनाना चाहते हैं।

यदि आप ऑटोलायआउट का उपयोग कर नहीं हैं, तो आपको -layoutSubviews विधि लागू करनी चाहिए। यह उचित समय पर बुलाया जाएगा अपने subviews लेआउट करने के लिए (उदाहरण के लिए जब आपके विचार में परिवर्तन के फ्रेम):

- (void)layoutSubviews 
{ 
    self.myLabel.frame = ...; 
} 

layoutSubviews विधि से आप self.bounds उपयोग कर सकते हैं उस समय दृश्य के आकार का पता लगाने के लिए। यह आपको बताएगा कि चीजों को सही तरीके से संरेखित या लपेटने के लिए आपको कितनी चौड़ाई/ऊंचाई है।

जब आपके विचार का उदाहरण बनाने की बात आती है, तो बस [[MyCustomView alloc] init] का उपयोग करें (जो initWithFrame: को रिक्त रेक्ट के साथ कॉल करेगा) या [[MyCustomView alloc] initWithFrame:...]।अपना फ्रेम सेट करें और इसे कुछ दृश्य में जोड़ें। layoutSubviews विधि सभी उचित समय पर बुलाया जाएगा और इसे तदनुसार रखा जाएगा।

2

अपनी खुद की कक्षा उप-वर्गीकरण UIView बनाएं, फिर initWithFrame या drawRect को ओवरराइड करें। एक नौसिखिया के लिए initWithFrame ओवरराइड करना आसान है।

आपका हैडर (ज) फ़ाइल इस के साथ शुरू कर देना चाहिए:

@interface YourOwnView : UIView 

... 

@end 

फिर, कार्यान्वयन फ़ाइल (मीटर) में आप अपने खुद के initWithFrame लागू करना चाहिए।

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     //ADDING NEW CONTENT 
     UILabel *yourLabel = [[UILabel alloc]init]; 
     //CUSTOMIZE your label's font, text, etc. 
     .... 

     //Add your label to your own view 
     [self addSubview:yourLabel]; 
    } 

    return self; 
} 

आपको प्रारंभकर्ता में अतिरिक्त डेटा या विकल्प की आवश्यकता हो सकती है, उदाहरण के लिए लेबल के लिए पाठ। इस मामले में आप इस तरह के अतिरिक्त तर्कों के साथ एक इनिट विधि परिभाषित कर सकते हैं:

- (id)initWithFrame:(CGRect)frame andLabelText:(NSString *)labelText; 
संबंधित मुद्दे

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