Как создать пользовательский класс представления программно?

Я хочу создать очень простой 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

Но мне нужно сделать это программно, пожалуйста, помогите. спасибо

Ответ 1

Вот простой способ, надеюсь, он вам поможет.

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


Ответ 2

Вы говорите, что не хотите использовать 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.

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

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

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

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

Ответ 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;
}

Ответ 4

Вы можете поместить эти строки в свой 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" программно..

Ответ 5

Создайте свой собственный класс 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 font, text, etc.
        ....

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

    return self;
 }

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

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