initWithImage работает отлично initWithFrame вызывается более одного раза
Я подкласс UIImageView
или же UIView
для генерации простых цветных плиток с цифрами. Если я использую UIImageView
, Я использую initWithImage
метод. Если я использую UIView
, метод initWithFrame
используется. Для инициализации используется либо изображение красного квадрата, либо программно сгенерированный красный вид.
Проблема видна на двух скриншотах: когда initWithImage
используется - все работает отлично. Если initWithFrame
Метод используется, я заканчиваю несколько белых видов без какой-либо информации, созданной в четном порядке с обычными видами. Все скриншоты и код прилагается.
Вот как это выглядит при инициализации с помощью initWithImage
:
- (id)initWithImage:(UIImage *)image {
self = [super initWithImage:image];
if (self) {
//Some non-important, label-related stuff.
[self addSubview:self.numberLabel];
}
return self;
}
И вот как это выглядит с 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, чтобы иметь наложенные представления