Возникли проблемы с CALayer - PullRequest
0 голосов
/ 20 ноября 2011

Итак, у меня есть класс, который возвращает CALayer с массивом CALayers, добавленным в качестве подслоев, но проблема в том, что он, похоже, не рендерит ни один из них. Я думаю, что я могу просто что-то упустить из-за того, как работают CALayers, потому что я еще не очень знаком. Может кто-нибудь взглянуть на мой код, чтобы увидеть, что я делаю неправильно?

- (CALayer*)drawMap {
    CALayer* theLayer = [CALayer layer];
    for (int y = 0; y < [self.height intValue]; y++) {
        for (int x = 0; x < [self.width intValue]; x++) {
            CALayer* tileLayer = [CALayer layer];
            tileLayer.bounds = CGRectMake((x * [self.tileWidth intValue]), (y * [self.tileHeight intValue]), [self.tileWidth intValue], [self.tileHeight intValue]);
            [tileLayer setBackgroundColor:[UIColor colorWithHue:(CGFloat)x saturation:(CGFloat)y brightness:255 alpha:1.0].CGColor];
            [theLayer addSublayer:tileLayer];
        }
    }
    [theLayer setBounds:CGRectMake([self.width intValue] * [self.tileWidth intValue], [self.height intValue] * [self.tileHeight intValue], 10, 10)];
    return theLayer;       
}

Это код, который инициализирует и рисует карту.

Map* myMap = [[Map alloc] initFromFile];
[myMap setWidth:[NSNumber numberWithInt:100]];
[myMap setHeight:[NSNumber numberWithInt:100]]; 

[self.view.layer insertSublayer:[myMap drawMap] above:self.view.layer];

Я могу предоставить заголовки, если это необходимо, но я не думаю, что проблема в этом, и я не хочу огромный пост.

1 Ответ

1 голос
/ 20 ноября 2011

Я думаю, что проблема заключается в границах, которые вы устанавливаете для родительского слоя:

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

Это дает плоскость оттенка / насыщенности, знакомую по многим художественным пакетам.

...