initWithImage工作正常initWithFrame被多次调用

时间:2014-10-12 01:26:56

标签: ios objective-c uiview uiimageview initwithframe

我正在对UIImageViewUIView进行子类化,以生成带数字的简单彩色图块。如果我使用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-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];
    }
}
谷歌搜索给我的印象是这是一个非常常见的问题,但我还没有找到任何解决方法如何击败它。而且,我仍然不明白,为什么数字是完全正确的顺序,唯一的问题是视图位置。

2 个答案:

答案 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;
}