gpt4 book ai didi

ios - UITextView、NSAttributedString 和自定义属性

转载 作者:可可西里 更新时间:2023-11-01 05:40:18 24 4
gpt4 key购买 nike

我在 Stack Overflow 上搜索了很多,但找不到解决方案。也许我只是误解了一些答案。

我创建了一个 UITextView 并且我正在使用 NSAttributedStrings 来处理 UITextView,这很好。

现在,添加自定义属性后,我卡住了。

我可以在哪里挂接以在 UITextView 中呈现我的自定义属性?是否有委托(delegate)方法,或者我是否必须创建自己的 UITextView 并覆盖方法?

最佳答案

您可以自定义NSLayoutManager,并实现它的-drawGlyphsForGlyphRange:atPoint:方法。

例如,您想要一个带有圆角半径的自定义背景

TextView 初始化:

NSTextStorage *textStorage = [NSTextStorage new];
CustomLayoutManager *layoutManager = [[CustomLayoutManager alloc] init];
CGSize containerSize = CGSizeMake(self.view.bounds.size.width, CGFLOAT_MAX);
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:containerSize];

textContainer.widthTracksTextView = YES;
[layoutManager addTextContainer:textContainer];
[textStorage addLayoutManager:layoutManager];

self.textView = [[UITextView alloc] initWithFrame:yourFrame textContainer:textContainer];

并应用您的自定义属性:

NSMutableAttributedString *mAttrStr = [[NSMutableAttributedString alloc] initWithString:@"SampleText"];
[mAttrStr addAttribute:YourCustomAttributeName value:[UIColor redColor] range:NSMakeRange(0, mAttrStr.length)]; //for example, you want a custom background with a corner radius
[self.textView.textStorage appendAttributedString:mAttrStr];

在 CustomLayoutManager.m 中

-(void)drawGlyphsForGlyphRange:(NSRange)glyphsToShow atPoint:(CGPoint)origin {
NSRange range = [self characterRangeForGlyphRange:glyphsToShow
actualGlyphRange:NULL];
//enumerate custom attribute in the range
[self.textStorage enumerateAttribute:YourCustomAttributeName inRange:range options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(id _Nullable value, NSRange range, BOOL * _Nonnull stop) {
if (value) {
UIColor *color = value; //the color set above

NSRange glyphRange = [self glyphRangeForCharacterRange:range
actualCharacterRange:NULL];
NSTextContainer *container = [self textContainerForGlyphAtIndex:glyphRange.location
effectiveRange:NULL];

//draw background
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextTranslateCTM(context, origin.x, origin.y);
[color setFill];
CGRect rect = [self boundingRectForGlyphRange:glyphRange inTextContainer:container];

//UIBezierPath with rounded
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:100];
[path fill];
CGContextRestoreGState(context);
//end draw

[super drawGlyphsForGlyphRange:range atPoint:origin];
}
else {
[super drawGlyphsForGlyphRange:range atPoint:origin];
}

}];
}

现在 'SampleText' 有一个红色的圆形背景。

关于ios - UITextView、NSAttributedString 和自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39367977/

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