2011-11-20 83 views
0

所以我有一個類返回一個CALayer,其中有一個CALayers數組添加爲子圖層,但問題是它似乎沒有渲染它們中的任何一個。我想我可能會錯過CALayers的工作方式,因爲我還不是很熟悉。有人可以看看我的代碼,看看我做錯了什麼嗎?CALayer問題

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

我可以提供標題如果需要,但我不認爲問題在那裏,我不想要一個巨大的職位。

+0

明顯的問題:tileWidth和tileHeight有合理的值嗎? – Tommy

回答

1

我認爲這個問題是你設置你的父母層界限:

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

這給了許多藝術包中熟悉的色調/飽和度平面。

+0

謝謝,修復它。我只是學習所有這些核心動畫的東西,所以我認爲這是錯誤的,但它看起來像我的所有錯誤都是基本的東西。 – Weston

+0

我並不擔心顏色是否正確,我只想爲瓷磚着色,以便看到它們。我正在嘗試使用Core Animation製作2D平鋪遊戲引擎。 – Weston