0

数字で単純なカラー タイルを生成するために、UIImageViewまたはのいずれかをサブクラス化しています。UIViewを使用している場合はUIImageView、メソッドを使用しますinitWithImage。を使用する場合UIView、メソッドinitWithFrameが使用されています。赤い正方形のイメージまたはプログラムで生成された赤いビューのいずれかが初期化に使用されます。
問題は 2 つのスクリーンショットで見ることができます: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;
}    

そして、別のクラス (UIScrollView サブクラス) からこれらの初期化子を呼び出す for ループ。ビューが初期化された後にラベル値が設定されています。

- (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

問題は、赤いビューのフレームをその境界ではなくスーパービューのフレームに設定していることです。赤いビューは 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 に答える