2012-05-15 28 views
1

我試圖在CALayer中渲染一些CoreText,以便我可以明確地調整該層的Alpha。我嘗試覆蓋drawRect:方法,但據我所知,只繪製視圖的根層,並且我有兩個子圖層,一個bg圖像和CoreText。下面是試圖繪製CoreText層的方法:在CALayers(這在drawRect中工作,如果我刪除代碼的createContext)爲CoreText創建CGContext

-(void) drawTextLayer 
{ 
    //get context 
UIGraphicsBeginImageContextWithOptions(CGSizeMake(250.0, 137.0), YES, 1.0); 
CGContextRef context = UIGraphicsGetCurrentContext(); 

//draw text 
//attribute string 
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:displayTxt]; 

//get font  
NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"idolwild" 
                ofType:@"ttf"]; 

CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)fontPath, kCFURLPOSIXPathStyle, false); 
CGDataProviderRef dataProvider = CGDataProviderCreateWithURL(url); 
CGFontRef theCGFont = CGFontCreateWithDataProvider(dataProvider); 
CTFontRef idolwild = CTFontCreateWithGraphicsFont(theCGFont, 16.0, &CGAffineTransformIdentity, nil); 

CFRelease(theCGFont); 
CFRelease(dataProvider); 
CFRelease(url); 

[attrStr addAttribute:(id)kCTFontAttributeName 
       value:(id)idolwild 
       range:NSMakeRange(0, [attrStr length])]; 


//create paragraph style and assign text alignment to it 
CTTextAlignment alignment = kCTCenterTextAlignment; 
CTParagraphStyleSetting _settings[] = { {kCTParagraphStyleSpecifierAlignment, sizeof(alignment), &alignment} }; 
CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(_settings, sizeof(_settings)/sizeof(_settings[0])); 

//set paragraph style attribute 
[attrStr addAttribute:(id)kCTParagraphStyleAttributeName 
       value:(id)paragraphStyle 
       range:NSMakeRange(0, [attrStr length])]; 


[attrStr addAttribute:(id)kCTForegroundColorAttributeName 
       value:(id)[UIColor clearColor].CGColor 
       range:NSMakeRange(0, [attrStr length])]; 


[attrStr addAttribute:(id)kCTForegroundColorAttributeName 
       value:(id)[UIColor blackColor].CGColor 
       range:NSMakeRange(0, [[wordRanges objectAtIndex:currentTextindex] intValue])]; 


//layout master 
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attrStr); 

//bounding eclipse 
CGMutablePathRef boundingEclipse = CGPathCreateMutable(); 
CGPathAddEllipseInRect(boundingEclipse, NULL, boundingEclipseRect); 


//ctframe 
CTFrameRef bubbleFrame = CTFramesetterCreateFrame(framesetter, 
                CFRangeMake(0, 0), 
                boundingEclipse, NULL); 

// flip the coordinate system 
CGContextSetTextMatrix(context, CGAffineTransformIdentity); 
CGContextTranslateCTM(context, 0, self.bounds.size.height); 
CGContextScaleCTM(context, 1.0, -1.0); 


    //fill bg to visual 
    CGContextAddPath(context, boundingEclipse); 
    [[UIColor greenColor] setFill]; 
    CGContextFillPath(context); 

//draw 
CTFrameDraw(bubbleFrame, context); 

//add to layer 
UIImage *tempImage = UIGraphicsGetImageFromCurrentImageContext(); 
textLayer.contents = tempImage; 

//cleanup 
CGPathRelease(boundingEclipse); 
CFRelease(framesetter); 
CFRelease(bubbleFrame); 
CFRelease(idolwild); 
CGContextRelease(context); 

[attrStr release]; 
} 

--any理論和CGContexts非常感謝

回答

2

我可以建議三個不同方法:

  1. 子類CALayer並執行其drawInContext:

  2. 將不是UIView的對象設置爲子層的delegate,然後執行drawLayer:inContext:

  3. 創建CGImage並將其設置爲圖層的內容:

    UIGraphicsBeginImageContext(size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    
    /// draw 
    
    UIImage * image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    
    sublayer.contents = (id)image.CGImage; 
    
+0

我想建議#3。關於前兩個建議的一個問題,drawInContext:方法,是否將CALayer作爲圖像繪製到上下文中,還是使用param上下文繪製CALayer? – TMacGyver