gpt4 book ai didi

ios - 为 CoreText 创建 CGContext

转载 作者:行者123 更新时间:2023-11-29 11:13:08 26 4
gpt4 key购买 nike

我试图在 CALayer 中渲染一些 CoreText,这样我就可以显式调整该层的 alpha。我尝试覆盖 drawRect: 方法,但据我所知,它只在 View 的根层上绘制,并且我有两个子层,一个 bg 图像和 CoreText。这是尝试绘制 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 的任何理论

最佳答案

我可以推荐三种不同的方法:

  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;

关于ios - 为 CoreText 创建 CGContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10605664/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com