2010-02-05 35 views

Trả lời

37

Tôi không nghĩ bạn có thể thêm lớp con UIView vào đối tượng CALayer. Tuy nhiên nếu bạn muốn vẽ văn bản trên một đối tượng CALayer, nó có thể được thực hiện bằng cách sử dụng các chức năng vẽ được cung cấp trong NSString UIKit additions như hình dưới đây. Trong khi mã của tôi được thực hiện trong drawLayer của delegate: phương thức inContext, cùng một phương thức có thể được sử dụng trong phương thức drawInContext: của lớp con. Có chức năng UILabel cụ thể nào bạn muốn sử dụng không?

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 
    CGContextSetFillColorWithColor(ctx, [[UIColor darkTextColor] CGColor]); 

    UIGraphicsPushContext(ctx); 
    /*[word drawInRect:layer.bounds 
      withFont:[UIFont systemFontOfSize:32] 
    lineBreakMode:UILineBreakModeWordWrap 
     alignment:UITextAlignmentCenter];*/ 

    [word drawAtPoint:CGPointMake(30.0f, 30.0f) 
      forWidth:200.0f 
      withFont:[UIFont boldSystemFontOfSize:32] 
     lineBreakMode:UILineBreakModeClip]; 

    UIGraphicsPopContext(); 
} 
+0

[[UIColor darkTextColor] đặt] cũng làm việc khi bối cảnh đồ họa đã được đẩy – rpetrich

+0

@ Deepak Danduprolu Công việc này dành cho tôi, nhưng tôi lang thang tại sao nên gọi chức năng push và pop để làm cho nó hoạt động – zeroleaf

4

UILabel của bạn đã có một CALayer đằng sau nó. Nếu bạn đang đặt cùng một số CALayers, bạn chỉ có thể thêm lớp của UILabel làm lớp con của một trong số đó (bằng cách sử dụng thuộc tính layer của nó).

Nếu đó là văn bản trực tiếp vẽ trong một lớp mà bạn muốn, bổ sung UIKit NSString mà Deepak chỉ đến là cách để đi. Để biết ví dụ về hành động này, Core Plot framework có lớp con CALayer độc lập với nền tảng Mac/iPhone hiển thị văn bản, CPTextLayer.

+0

Hey Brad, tôi thực sự sử dụng kỹ thuật này, (thêm một lớp của UILabel vào một CALayer) và có vẻ như nó ngừng hoạt động trong SDK cơ sở iOS 8? Tôi đã bắt đầu xây dựng lại một ứng dụng cũ mà tôi đã tạo để xuất video và các lớp con của cha mẹ CALayer dường như vẫn không có mã cũ này. Có thể là một cái gì đó sai, sẽ tiếp tục tìm kiếm. –

+0

Đã sửa lỗi. Đối với bất kỳ ai khác cùng tìm kiếm cách làm công việc này được biên soạn dựa trên iOS 8 Base SDK, hãy gọi [label.layer display] trước khi thêm lớp của nhãn này vào một CALayer khác. Tín dụng: http://stackoverflow.com/questions/23171790/is-it-safe-to-add-a-stolen-uilabels-layer-to-some-other-calayers-sublayer –

2

Thêm CATextLayer làm lớp con và đặt thuộc tính chuỗi. Điều đó sẽ dễ nhất và bạn có thể dễ dàng sử dụng trình quản lý bố cục để làm cho nó rất chung chung.

+2

... _can dễ dàng sử dụng bố cục manager _... Vâng, trong MacOS, có, nhưng không phải trong iOS. CALayers trong iOS không hỗ trợ trình quản lý bố cục: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Layout.html – Dalbergia

+0

Không biết điều đó! Cảm ơn anh bạn. –

135
 CATextLayer *label = [[CATextLayer alloc] init]; 
     [label setFont:@"Helvetica-Bold"]; 
     [label setFontSize:20]; 
     [label setFrame:validFrame]; 
     [label setString:@"Hello"]; 
     [label setAlignmentMode:kCAAlignmentCenter]; 
     [label setForegroundColor:[[UIColor whiteColor] CGColor]]; 
     [layer addSublayer:label]; 

     [label release]; 
+3

IMHO, đây là giải pháp đơn giản hơn so với lớp tùy chỉnh hoặc lớp đại biểu miễn là bạn không cần nhiều hơn bản vẽ văn bản cơ bản. CATextLayer đã biết cách vẽ văn bản, vì vậy không cần phải tái tạo lại bánh xe. – Dalbergia

+0

@ Mshah2 tại sao văn bản lại có hiệu ứng phi antialiasing? văn bản trông giống như được phóng đại – sreekanthk

+16

Bạn cần phải điều chỉnh tỷ lệ nội dung của CALayer nếu không bạn sẽ nhận được văn bản mờ trên võng mạc (@ 2x) hoặc @ 3x thiết bị. Sử dụng: label.contentsScale = [UIScreen mainScreen] .scale; – yonel

-1

Luôn luôn nhớ để loại bỏ lớp con trước, nếu bạn sẽ thêm một số khác, để ngăn chặn quan điểm nhân đôi:

if let sublayers = layer.sublayers { 
    for sublayer in sublayers { 
     sublayer.removeFromSuperlayer() 
    } 
} 
Các vấn đề liên quan