2013-08-01 4 views
12

Я хочу создать очень простой customView с несколькими UIlabel на нем, как мне это сделать. любой учебник или предложение будут оценены. Я новичок в этом, раньше не пытался.Как создать настраиваемый класс представления программно?

Я пробовал это с помощью 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

Этот вопрос слишком широк для простого вопроса QA. Пройдите через книгу, которая охватывает все программно. – bryanmac

+0

пройти через любую базовую учебную книгу. это самая основная вещь – iProgrammer

+0

@Ezimettekin Вы хотите создать пользовательский вид в уже существующем классе или хотите создать класс UIView с файлом nib – Vishnu

ответ

28

Вот простой способ, надеюсь, это час лопнет вас.

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

Пожалуйста, исправьте меня, если я ошибаюсь: 1. если я хочу создать пользовательский что его * ширина * должна относиться к его супервирусу, тогда никакие манипуляции (связанные с супервидом) не могут быть выполнены в классе customView. Ограничения могут быть выполнены только тогда, когда они фактически добавлены в супервизор. 2. Если я не хочу, чтобы его ширина была относительной, я могу просто запустить ее с помощью фиксированного фрейма или что-то только на основе размера экрана 3. В customView я могу просматривать объекты (метки, текстовые поля и т. Д.), и их ограничения на customView – Honey

+0

@Honey это обычно не так уж просто. представления, как правило, теперь имеют маску авторезистирования, преобразованную в ограничения, так что это зависит от того, как она настроена. Вы также можете использовать функции subviews и функции ограничения обновлений для обновления правил, которые применяются ... – Wain

+0

Я не уверен, что понимаю вас ... то, что я в конечном счете спрашиваю, может ли класс установить его рамки/ограничения относительно это супервизор - из своего класса? Или это всегда должно быть от супервизора? – 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

double equal? ​​(==) – ruandao

5

Вы говорите, что вы не хотите использовать XIB и хотите, чтобы сделать все это программно.

Вы должны реализовать initWithFrame: метод:

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

Таким образом, вы создать и настроить элементы управления (шрифты, цвета, маски и т.д. автоматического изменения) и добавить их в качестве подвидов, все из метода initWithFrame:. Вероятно, вы захотите разбить код на разные методы, чтобы сохранить чистоту.

Если вы используете автозапуск, вы также хотите создать все свои ограничения из метода init.

Если вы используете не, используя autolayout, вы должны реализовать метод -layoutSubviews. Это будет называться в подходящее время, чтобы макет вашего подвидов (например, когда кадр ваших изменений зрения):

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

От метода layoutSubviews вы можете получить доступ к self.bounds, чтобы выяснить размер представления в то время. Это позволит вам узнать, сколько ширины/высоты вы должны выровнять или правильно перенести.

Когда дело доходит до создания экземпляра вашего вида, просто используйте [[MyCustomView alloc] init] (который вызовет с пустым прямоугольником) или [[MyCustomView alloc] initWithFrame:...].Установите его рамку и добавьте ее в некоторый вид. Метод layoutSubviews будет вызываться во все соответствующие моменты времени, и он будет уложен соответствующим образом.

2

Создайте свой собственный класс UIView для подкласса класса, затем переопределите initWithFrame или drawRect. Переопределение initWithFrame проще для новичков. Файл

Ваш заголовок (.h) следует начать с этого:

@interface YourOwnView : UIView 

... 

@end 

Затем в файле реализации (.m), вы должны реализовать свой собственный 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; 
} 

Возможно, вам потребуются дополнительные данные или параметры в инициализаторе, например текст для меток. В этом случае вы можете определить метод init с дополнительными аргументами, такими как:

- (id)initWithFrame:(CGRect)frame andLabelText:(NSString *)labelText;