gpt4 book ai didi

cocoa-touch - 在UITextView中显示带有超大首字母的文本 block

转载 作者:行者123 更新时间:2023-12-02 03:58:59 25 4
gpt4 key购买 nike

有什么办法可以在UITextView中提供这种效果?如果没有,那我怎么能达到这种效果呢?

最佳答案

具有相同的要求,我创建了一个UIView子类,该子类使用首字下沉绘制文本。该文本是使用核心文本绘制的,并且@CodaFi建议将首字下​​沉绘制在单独的核心文本框架中。

该类的完整实现:​​https://gist.github.com/4596476

它的实质看起来像这样:

- (void)drawRect:(CGRect)rect {
// Create attributed strings
NSAttributedString *bodyText = [[NSAttributedString alloc] initWithString:[self.text substringWithRange:NSMakeRange(1, self.text.length -1)] attributes:_bodyAttributes];
NSAttributedString *capText = [[NSAttributedString alloc] initWithString:[[self.text substringWithRange:NSMakeRange(0, 1)] uppercaseString] attributes:_capAttributes];

CGRect capFrame = CGRectMake(0, 0, [capText size].width, [capText size].height);

// Set up graphics context
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CGContextTranslateCTM(context, 0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

// Create type frames
CGMutablePathRef bodyPath = CGPathCreateMutable();
CGAffineTransform transform = CGAffineTransformTranslate(CGAffineTransformMakeScale(1, -1), 0, -self.bounds.size.height);
CGPathMoveToPoint(bodyPath, &transform, CGRectGetMaxX(capFrame), 0);
CGPathAddLineToPoint(bodyPath, &transform, self.bounds.size.width, 0);
CGPathAddLineToPoint(bodyPath, &transform, self.bounds.size.width, self.bounds.size.height);
CGPathAddLineToPoint(bodyPath, &transform, 0, self.bounds.size.height);
CGPathAddLineToPoint(bodyPath, &transform, 0, CGRectGetMaxY(capFrame));
CGPathAddLineToPoint(bodyPath, &transform, CGRectGetMaxX(capFrame), CGRectGetMaxY(capFrame));
CGPathCloseSubpath(bodyPath);

CGMutablePathRef capPath = CGPathCreateMutable();
CGPathAddRect(capPath, &transform, CGRectMake(0, 0, capFrame.size.width+10, capFrame.size.height+10));

// Draw text
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef) bodyText);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), bodyPath, NULL);
CFRelease(framesetter);
CTFrameDraw(frame, context);
CFRelease(frame);
framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)capText);
frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), capPath, NULL);
CFRelease(framesetter);
CTFrameDraw(frame, context);
CFRelease(frame);
}

要点是,您将创建两条路径,一个矩形用于包含首字下沉,一个矩形用于在文本的其余部分中删除凹口。基于gist的完整实现可让您使用属性控制字体,首字下沉的间距以及整个 View 的内容插图。

它没有实现 UITextView的大多数功能(仅实现我需要的功能),因此它可能不是完整的解决方案。

希望有帮助!

关于cocoa-touch - 在UITextView中显示带有超大首字母的文本 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11289552/

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