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

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

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


person Ezimet    schedule 01.08.2013    source источник
comment
Этот вопрос слишком широк для простого вопроса QA здесь. Прочитайте книгу выше, которая охватывает все программно.   -  person bryanmac    schedule 01.08.2013
comment
@Ezimettekin Вы хотите создать собственное представление в уже существующем классе или хотите создать класс UIView с файлом пера   -  person Vishnu    schedule 01.08.2013


Ответы (5)


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

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


person Shankar BS    schedule 01.08.2013

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

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

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

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

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

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

person Mike Weller    schedule 01.08.2013

Обновите свой класс, чтобы реализовать 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;
}
person Wain    schedule 01.08.2013
comment
Пожалуйста, поправьте меня, если я ошибаюсь: 1. если я хочу создать пользовательское представление, в котором его ширина должна быть относительно его суперпредставления, тогда никакие манипуляции (связанные с суперпредставлением) не могут быть выполнены в пользовательском представлении. учебный класс. Ограничения могут быть выполнены только тогда, когда они фактически добавлены в superView. 2. Если я не хочу, чтобы его ширина была относительной, я могу просто инициализировать его с фиксированной рамкой или чем-то, основанным только на размере экрана. 3. В customView я могу использовать подпредставления (метки, текстовое поле и т. и их ограничения для customView - person Honey; 16.05.2017
comment
@ Дорогая, обычно это не так просто. представления обычно имеют свою маску автоматического изменения размера, преобразованную в ограничения, поэтому это зависит от того, как это настроено. Вы также можете использовать подпредставления макета и функции обновления ограничений для обновления применяемых правил... - person Wain; 17.05.2017
comment
Я не уверен, что понимаю вас... в конечном итоге я спрашиваю, может ли класс установить свои рамки/ограничения относительно своего superView - из своего собственного класса? Или это всегда должно быть из superView? - person Honey; 17.05.2017
comment
Фрейм вида находится в контексте его границ супервизора, но кто его устанавливает, не имеет значения. Представление может установить свой собственный фрейм. Как правило, это считается плохой практикой, когда подвид знает о кадре супервизора... - person Wain; 17.05.2017

Создайте свой собственный класс, являющийся подклассом 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;
 }

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

- (id)initWithFrame:(CGRect)frame andLabelText:(NSString *)labelText;
person Zeke    schedule 01.08.2013

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

person v-i-s-h-a-l    schedule 01.08.2013