2012-08-01 74 views
3

我做了以下內容:添加文字的CALayer:drawInRect不工作

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 

     UIGraphicsPushContext (ctx); 

     CGRect r = CGRectMake(500, 300, 200, 100); 
     NSString *text = [[NSString alloc] initWithString:@"raaaaaaaa!"]; 
     UIColor *color = [ UIColor colorWithRed: (200.0f) green: (100.0) blue:(200.0f) alpha: 1.0f ]; 
     [color set]; 

     [ text drawInRect: r withFont:[UIFont systemFontOfSize:50] lineBreakMode: UILineBreakModeWordWrap alignment: UITextAlignmentLeft ]; 
     [text release]; 

     UIGraphicsPopContext(); 
    } 
    } 
} 

上面的代碼無法正常工作。爲什麼?

,如果我做的不是跟隨,是工作:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 
     UIGraphicsPushContext (ctx); 

     CATextLayer *label = [[CATextLayer alloc] init]; 
     [label setFont:@"Didot"]; 
     [label setFontSize:50]; 
     [label setFrame:CGRectMake(400, 300, 400, 100)]; 
     [label setString:@"Helloooooooooooooooooo"]; 
     [label setAlignmentMode:kCAAlignmentCenter]; 
     [label setForegroundColor:[[UIColor blueColor] CGColor]]; 
     [layer addSublayer:label]; 
     [label release]; 

     UIGraphicsPopContext(); 
    } 
} 

的區別是什麼,爲什麼drawInRect什麼都不做?

謝謝

編輯 所以,我沒有使用正確的UIColor,所以我改變

UIColor *color = [ UIColor colorWithRed: (200.0f) green: (100.0) blue:(200.0f) alpha: 1.0f ]; 

UIColor *color = [UIColor colorWithRed:200/255.0 green:100/255.0 blue: 200/255.0 alpha: 1.0]; 

仍然沒有運氣,我不能使用drawInRect時看到任何文字

+2

你與白色的白色層上繪製...(1添加此例)。 rgba值從0.0到1.0(不是255) – 2012-08-01 20:00:49

+0

@DavidRönnqvist我以爲是的,但沒有運氣。使用drawIinRect時仍然沒有文字:( – peterphonic 2012-08-01 20:38:08

回答

7

有你兩個問題問:

上面的代碼無法正常工作。爲什麼?

起初我以爲文字沒有出現,因爲它是用白色的白色繪製的。雖然它可能仍然如此,但這不是唯一的問題。

您正在將文本繪製到(r)中的矩形與您正在繪製的圖層的邊界相關。如果要繪製圖層的左上角,則矩形的原點應該是(0,0)。上面的代碼是仍然不工作。

如果您檢查CGSize drawInRect:withFont:... returns(渲染文本的大小),您可以看到渲染文本的大小爲0寬。這表示矩形繪製的高度爲100是不夠的。增加矩形的高度解決了這個問題,現在文本是可見的。如果您在圖層中繪製某些文本,可能要繪製的最明智的矩形是圖層的邊界(CGRect r = [layer bounds];)。

我做了什麼,使其工作:

  • 更改文本顏色
  • 改變r原點(0,0)
  • r

增加高度是什麼是不同的[...]?

在第一個您繪製文本層的圖形上下文(什麼drawLayer:inContext的:是應該做的),但在秒例如要添加另一層層的層次結構,而不是繪圖在裏面。每當您的圖層重新繪製時,都會添加一個新的文本圖層。所以實際上沒有任何東西被繪製到圖層上下文中。

接下來發生的事情是,在圖層自己繪製之後(空),圖層的子圖層將自己繪製並將其內容組合在圖層上。這就是爲什麼你會看到文字圖層的文字。

如果您添加這樣的文本圖層,您可以通過不必進行任何手動繪圖來提高代碼效率。這就要求文本圖層在某個早期點(只有一次)被添加到圖層中,並且您不需要執行任何自定義繪圖(它通常很慢)。

+0

謝謝你的偉大答案和耐心! – peterphonic 2012-08-02 13:11:16

1

只有當你讀過的UIColor的類參考...

UIColor *color = [UIColor colorWithRed:200/255.0 green:100/255.0 blue: 200/255.0 alpha: 1.0]; 

將解決你的問題。

+0

我以爲是它,但沒有運氣。使用drawIinRect時仍然沒有文字:( – peterphonic 2012-08-01 20:38:51

0

我也許你的框架的座標是錯誤的。

CGRect r = CGRectMake(500, 300, 200, 100); 
[label setFrame:CGRectMake(400, 300, 400, 100)]; 

注iPhone屏幕尺寸是320×460或3 20 * 568(iPhone5的)。在你的代碼中,你設置了超出屏幕的x座標400和500。

注意你的協調應遵循X < = 320,或者你不能看到它在屏幕上,除非你在一個滾動視圖