数字で単純なカラー タイルを生成するために、UIImageView
またはのいずれかをサブクラス化しています。UIView
を使用している場合はUIImageView
、メソッドを使用しますinitWithImage
。を使用する場合UIView
、メソッドinitWithFrame
が使用されています。赤い正方形のイメージまたはプログラムで生成された赤いビューのいずれかが初期化に使用されます。
問題は 2 つのスクリーンショットで見ることができます: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;
}
そして、別のクラス (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];
}
}
グーグルは、これは非常に一般的な問題であるという印象を与えましたが、これを解決する方法は見つかりませんでした. さらに、数字が完全に正しい順序になっている理由はまだわかりません。唯一の問題はビューの位置です。