1

そのレイヤーのアルファを明示的に調整できるように、CALayer で CoreText をレンダリングしようとしていました。drawRect: メソッドをオーバーライドしようとしましたが、私の知る限り、それはビューのルート レイヤーにしか描画されず、bg 画像と CoreText の 2 つのサブレイヤーがあります。CoreText レイヤーを描画しようとするメソッドは次のとおりです (createContext コードを削除すると、drawRect で機能します)。

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

-- CALayers と CGContexts に関する理論は大歓迎です

4

1 に答える 1

2

次の 3 つの方法を提案できます。

  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;
    
于 2012-05-17T21:17:19.753 に答える