gpt4 book ai didi

ios - 如何从 UILabel 的第 n 行获取文本/字符串?

转载 作者:IT王子 更新时间:2023-10-29 05:20:20 25 4
gpt4 key购买 nike

是否有一种简单的方法来获取(或简单地显示)UILabel 中给定行的文本?

我的 UILabel 正确显示了我的文本并且布局精美,但偶尔我需要能够只显示某些行,但显然我需要知道 UILabel 如何定位所有内容才能做到这一点。

我知道这可以通过子字符串轻松完成,但我需要知道该行的起点和终点。

或者,如果 UILabel 的框架有某种偏移量,我可以滚动 UILabel 并隐藏我不想看到的其余内容。

我无法发现任何可以证明如何轻松完成此操作的信息。有人有什么好主意吗?

谢谢

爱华

最佳答案

我有更好的方法找到它。

你可以在 CoreText.framework 的帮助下得到这个.

1.添加CoreText.framework .
2.导入 #import <CoreText/CoreText.h>
然后使用下面的方法:

- (NSArray *)getLinesArrayOfStringInLabel:(UILabel *)label {
NSString *text = [label text];
UIFont *font = [label font];
CGRect rect = [label frame];

CTFontRef myFont = CTFontCreateWithName((__bridge CFStringRef)([font fontName]), [font pointSize], NULL);
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:text];
[attStr addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)myFont range:NSMakeRange(0, attStr.length)];


CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attStr);

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(0,0,rect.size.width,100000));

CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);

NSArray *lines = (__bridge NSArray *)CTFrameGetLines(frame);
NSMutableArray *linesArray = [[NSMutableArray alloc]init];

for (id line in lines)
{
CTLineRef lineRef = (__bridge CTLineRef )line;
CFRange lineRange = CTLineGetStringRange(lineRef);
NSRange range = NSMakeRange(lineRange.location, lineRange.length);

NSString *lineString = [text substringWithRange:range];
[linesArray addObject:lineString];
}

return (NSArray *)linesArray;
}

调用此方法:-

NSArray *linesArray = [self getLinesArrayOfStringInLabel:yourLabel];

现在您可以使用 linesArray .

SWIFT 4 版本

func getLinesArrayOfString(in label: UILabel) -> [String] {

/// An empty string's array
var linesArray = [String]()

guard let text = label.text, let font = label.font else {return linesArray}

let rect = label.frame

let myFont = CTFontCreateWithFontDescriptor(font.fontDescriptor, 0, nil)
let attStr = NSMutableAttributedString(string: text)
attStr.addAttribute(kCTFontAttributeName as NSAttributedString.Key, value: myFont, range: NSRange(location: 0, length: attStr.length))

let frameSetter: CTFramesetter = CTFramesetterCreateWithAttributedString(attStr as CFAttributedString)
let path: CGMutablePath = CGMutablePath()
path.addRect(CGRect(x: 0, y: 0, width: rect.size.width, height: 100000), transform: .identity)

let frame: CTFrame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, nil)
guard let lines = CTFrameGetLines(frame) as? [Any] else {return linesArray}

for line in lines {
let lineRef = line as! CTLine
let lineRange: CFRange = CTLineGetStringRange(lineRef)
let range = NSRange(location: lineRange.location, length: lineRange.length)
let lineString: String = (text as NSString).substring(with: range)
linesArray.append(lineString)
}
return linesArray
}

使用:

let lines: [String] = getLinesArrayOfString(in: label)

关于ios - 如何从 UILabel 的第 n 行获取文本/字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4421267/

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