initWithImage работает отлично initWithFrame вызывается более одного раза

Я подкласс UIImageView или же UIView для генерации простых цветных плиток с цифрами. Если я использую UIImageView, Я использую initWithImage метод. Если я использую UIView, метод initWithFrame используется. Для инициализации используется либо изображение красного квадрата, либо программно сгенерированный красный вид.
Проблема видна на двух скриншотах: когда initWithImage используется - все работает отлично. Если initWithFrame Метод используется, я заканчиваю несколько белых видов без какой-либо информации, созданной в четном порядке с обычными видами. Все скриншоты и код прилагается.

Вот как это выглядит при инициализации с помощью initWithImage:initWithImage

- (id)initWithImage:(UIImage *)image {
    self = [super initWithImage:image];
    if (self) {
//Some non-important, label-related stuff.
        [self addSubview:self.numberLabel];
    }
    return self;
}

И вот как это выглядит с initWithFrame:
initWithFrame

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.redView = [self redViewWithFrame:frame];
        [self addSubview:self.redView];
//label-related stuff
    }
    return self;
}


- (UIView *)redViewWithFrame:(CGRect)frame {
    UIView *view = [[UIView alloc] initWithFrame:frame];
    view.backgroundColor = [UIColor redColor];
    view.alpha = 1;
    return view;
}    

И цикл for, вызывающий эти инициализаторы из другого класса (подкласс UIScrollView). Значение метки устанавливается после инициализации представления.

- (void)setNumberOfBlocks:(NSInteger)numberOfBlocks {
    _blocks = [[NSMutableArray alloc] init];

    CGSize contentSize;
    contentSize.width = BLOCK_WIDTH * (numberOfBlocks);
    contentSize.height = BLOCK_HEIGHT;

    self.contentSize = contentSize;

    for (int i = 0; i < numberOfBlocks; i++) {
        CGFloat totalWidth = BLOCK_WIDTH * i;
        CGRect frame = CGRectMake(0, 0, BLOCK_WIDTH, BLOCK_HEIGHT);

        frame.origin.x = totalWidth;


        BlockView *view = [[BlockView alloc] initWithImage:[UIImage imageNamed:@"block.png"]];
        OR!!!
        BlockView *view = [[BlockView alloc] initWithFrame:frame];


        view.frame = frame;
        NSString *number = [NSString stringWithFormat:@"%ld", (long)i + 1];
        view.numberLabel.text = number;


        [self addSubview:view];
        [_blocks addObject:view];
    }
}

Гугление создало у меня впечатление, что это очень распространенная проблема, но я не нашел никакого решения, как победить это. Более того, я до сих пор не понимаю, почему числа находятся в абсолютно правильном порядке, единственная проблема - это позиция взгляда.

2 ответа

Решение

Проблема в том, что вы устанавливаете рамку красного вида на рамку суперпредставления вместо его границ. Поскольку красный вид является подпредставлением BlockView, его кадр должен быть относительно его суперпредставления, которое вы получаете с границами (непонятно, зачем вам даже нужен красный вид, в отличие от установки цвета фона для блочного представления в красный).

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.redView = [self redViewWithFrame:self.bounds];
        [self addSubview:self.redView];
//label-related stuff
    }
    return self;
}

Я думаю, что вы должны установить начало кадра (0,0) в redViewWithFrame в ordre, чтобы иметь наложенные представления

Другие вопросы по тегам