Фрейм не устанавливается с помощью initWithFrame с помощью xib

У меня огромные проблемы с изучением автомакета, особенно при интеграции xibs и uiscrollviews. Пытаясь упростить свою проблему, я начал новый проект с одним представлением, привязанным к раскадровке. Затем я создал подкласс UIView (Diptic) и создал для него xib-файл. Моя раскадровка не использует автомакет, но мой Diptic xib использует. Прямо сейчас я хочу иметь горизонтальный scrollView с несколькими экземплярами Diptic, расположенными поперек него. Но я получаю только первый диптический экземпляр, потому что фрейм неправильно инициализируется.

В моем ViewController.m viewDidLoad:

 self.scrollView.contentSize = CGSizeMake((self.view.frame.size.width+10)*5, self.view.frame.size.height);
    for (int i = 0; i < 5; i++){
        int x = i*(self.view.frame.size.width+10);
        Diptic *diptic = [[Diptic alloc] initWithFrame:CGRectMake(x, 50, self.view.frame.size.width, self.view.frame.size.height-100)];
        [self.scrollView addSubview:diptic];
        [array addObject:diptic];

        UIView *greenBox = [[UIView alloc] initWithFrame:CGRectMake(x, 5, 40, 40)];
        greenBox.backgroundColor = [UIColor greenColor];
        [self.scrollView addSubview:greenBox];
    }

Диптик.м

#import "Diptic.h"
@implementation Diptic
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        NSArray* views = [[NSBundle mainBundle] loadNibNamed:@"Diptic" owner:nil options:nil];
        self = [views objectAtIndex:0];
        self.label.text = @"WOOT";
        self.backgroundColor = [UIColor redColor];
    }
    return self;
}
@end

Если я устанавливаю рамку после того, как добавляю ее в представление, кажется, что она работает, но почему я не могу установить рамку с помощью initWithFrame?


person Chase Roberts    schedule 16.09.2014    source источник


Ответы (2)


Проблема здесь в том, что вы назначаете фрейм представлению, созданному с помощью вызова [super initWithFrame:frame]. Когда NIB загружается в - (id)initWithFrame:(CGRect)frame, self заменяется представлением из [views objectAtIndex:0], и кадр для этого представления никогда не устанавливается. Вместо этого исключите вызов super и вместо этого загрузите представление из NIB:

#import "Diptic.h"
@implementation Diptic

- (id)initWithFrame:(CGRect)frame
{
    NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"Diptic" owner:nil options:nil];
    self           = [views objectAtIndex:0];
    if (self) {
        self.frame           = frame;
        self.label.text      = @"WOOT";
        self.backgroundColor = [UIColor redColor];
    }
    return self;
}

@end
person dbart    schedule 16.09.2014
comment
Невозможно назначить себя вне метода семейства init. И вы правы, initWithFrame не вызывается из xib. Он вызывается, когда я вызываю его в ViewController. - person Chase Roberts; 16.09.2014

При инициализации представления/контроллера из раскадровки или из xib метод инициализации

- (id)initWithCoder:(NSCoder *)decoder

попробуйте сделать другие вещи в этом методе

person dopcn    schedule 16.09.2014