Я думаю, что проблема заключается в границах, которые вы устанавливаете для родительского слоя:
[theLayer setBounds:
CGRectMake(
[self.width intValue] * [self.tileWidth intValue],
[self.height intValue] * [self.tileHeight intValue],
10, 10)];
Может показаться, что границы устанавливаются так, что он начинается точно после всех добавленных вами подслоев.и простирается на 10 баллов в обоих направлениях.Я думаю, что было бы более уместно следующее:
[theLayer setBounds:
CGRectMake(
0,
0,
[self.width intValue] * [self.tileWidth intValue],
[self.height intValue] * [self.tileHeight intValue])];
Следующее также выглядит подозрительно:
[self.view.layer insertSublayer:[myMap drawMap] above:self.view.layer];
[myMap drawMap]
станет подуровнем self.view.layer
.self.view.layer
не является его собственным подпредставлением, поэтому он не будет знать, что делать с этой инструкцией above:
.Вы, вероятно, хотите просто addSublayer:
.
Наконец, это:
tileLayer.bounds = CGRectMake((x * [self.tileWidth intValue]), (y * [self.tileHeight intValue]), [self.tileWidth intValue], [self.tileHeight intValue]);
дает каждому из ваших подслоев абсолютно одинаковые frame
.Так же, как UIView
s, bounds
являются областью источника информации, а кадр - это место, где эта информация будет помещена в суперслой.Я думаю, что, вероятно, вы хотите установить frame
.
Наконец, UIColor +colorWithHue:...
ограничивает оттенок и насыщенность до диапазона [0, 1], так что вы, вероятно, хотите (CGFloat)x / [self.width floatValue]
и эквивалент для насыщенности, чтобы обеспечить все вашиплитки имеют разные цвета.
РЕДАКТИРОВАТЬ: поэтому, связав все это вместе, я немного изменил ваш код, чтобы мне не пришлось писать полный охватывающий класс, и добавил его в проект на основе представления Xcodeшаблон выглядит следующим образом:
#define kTileWidth 3
#define kTileHeight 3
#define kWidth 100
#define kHeight 100
- (CALayer*)drawMap {
CALayer* theLayer = [CALayer layer];
for (int y = 0; y < kHeight; y++)
{
for (int x = 0; x < kWidth; x++)
{
CALayer* tileLayer = [CALayer layer];
tileLayer.frame = CGRectMake((x * kTileWidth), (y * kTileHeight), kTileWidth, kTileHeight);
[tileLayer setBackgroundColor:[UIColor colorWithHue:(CGFloat)x/kWidth saturation:(CGFloat)y/kHeight brightness:255 alpha:1.0].CGColor];
[theLayer addSublayer:tileLayer];
}
}
[theLayer setFrame:CGRectMake(0, 0, kWidth * kTileWidth, kHeight * kTileHeight)];
return theLayer;
}
// ...
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self.view.layer addSublayer:[self drawMap]];
}
Это дает плоскость оттенка / насыщенности, знакомую по многим художественным пакетам.