我正在对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-loop,从另一个类(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];
}
}
谷歌搜索给我的印象是这是一个非常常见的问题,但我还没有找到任何解决方法如何击败它。而且,我仍然不明白,为什么数字是完全正确的顺序,唯一的问题是视图位置。
答案 0 :(得分:1)
我认为您应该在ordre中的redViewWithFrame中将帧原点设置为(0,0)以支持叠加视图
答案 1 :(得分:1)
问题在于您将红色视图的帧设置为超视图的帧而不是其边界。由于红色视图是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;
}