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非常感謝
我想建議#3。關於前兩個建議的一個問題,drawInContext:方法,是否將CALayer作爲圖像繪製到上下文中,還是使用param上下文繪製CALayer? – TMacGyver