0

我将一个UIImageViewUIView用于生成带有数字的简单颜色图块。如果我使用UIImageView,我使用initWithImage方法。如果我使用UIViewinitWithFrame则正在使用该方法。红色方形图像或以编程方式生成的红色视图用于初始化。
可以在两个屏幕截图中看到问题:何时initWithImage使用 - 一切正常。如果initWithFrame正在使用方法,我将以多个白色视图结束,而没有以正常视图的均匀顺序创建任何信息。附上所有截图和代码。

这是使用初始化时的外观initWithImageinitWithImage

- (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];
    }
}

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

4

2 回答 2

1

我认为您应该在 redViewWithFrame 中将框架原点设置为 (0,0) 以便叠加视图

于 2014-10-12T01:59:48.957 回答
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;
}
于 2014-10-12T02:09:36.277 回答