我将一个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];
}
}
谷歌搜索给我的印象是这是一个非常普遍的问题,但我还没有找到任何解决方案来解决这个问题。此外,我仍然不明白,为什么数字完全正确,唯一的问题是视图位置。