我有一个很长的NSStringUIFont和所需的宽度 我只想在给定的UIFont中获得适合宽度的字符串的第一行。 通过“获取”我的意思是获得一个子串。 第二行可能会被截断,并且第一行中必须包含自动换行。

我怎样才能做到这一点? 请告诉我正确的方向。 谢谢!

===============>>#1 票数:2 已采纳

我认为没有简单,干净而优雅的方法可以做到这一点。 但是,如果您查看NSString UIKit Additions参考 ,则有些方法可能会帮助您获得一个很好的近似值。

特别要看:

 CGSize aSize = 
 [ myString  sizeWithFont:(UIFont *)aFont 
        constrainedToSize:(CGSize ) aSize ];

使用所需宽度的aSize和所需高度的2 * fontSize(用于2行)。 取结果宽度(aSize.width)除以您的字体大小。 如果它适合放在这个框中,这应该接近你的字符串被截断的位置。

现在不幸的是,您需要字体比率(点大小与宽度之比),我不知道该如何获得。 我已经确定地确定它在4到6之间,但这就像说pi大约是3。

无论如何,你的字符串被截断的近似索引将是

 ( fontRatio * aSize.width ) / fontSize;

我写了一个小模拟器项目来测试线宽,字体比,字体大小等各种组合,欢迎您使用。 它在这里: 字符串测试项目

===============>>#2 票数:1

这个怎么样?

- (NSString*) stringWithString:(NSString*)longString width:(float)width font:(UIFont*)font {

    if([longString sizeWithFont:font].width < width) {
        return longString;
    }

    NSMutableString* mutString = [NSMutableString stringWithFormat:@""];
    int i = 0;
    while ([mutString sizeWithFont:font].width < width && i < [longString length]) {
        unichar ch = [longString characterAtIndex:i];
        [mutString appendString:[NSString stringWithCharacters:&ch length:1]];
        i++;
    }

    NSString* shortenedString = [mutString substringToIndex:[mutString length] - 1];

    return shortenedString;
}

基本上我逐个添加字符,并且每次检查是否达到了所需的宽度。

编辑:

使用自动换行和两行,您可以调整上面的代码并使用以下内容检查大小:

[mutString sizeWithFont:font constrainedToSize:CGSizeMake(9999999, font.lineHeight*2) lineBreakMode:UILineBreakModeWordWrap]

除了使用单个字符,您还可以对单词进行相同的操作:

[longString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]

这将返回一个包含字符串中所有单词的数组,可用于循环遍历。

===============>>#3 票数:0

您可以尝试使UILabel中的前两行文本具有必要的宽度。 您可以设置此标签的字体。 然后,您可以使用另一个标签,以其他字体保存文本的其余部分。 希望这可以帮助。

===============>>#4 票数:0

通过“获取”你的意思是画出它,在前两行后截断? 或者检索一个字符串,表示前两行的空间是什么?

对于前者,您只需绘制它,UILabel就会为您截断。

对于后者,我认为你将不得不打破自己这个词并测量子串以找出适合的东西。

===============>>#5 票数:0

const int kPadding = 4; // Padding for the diference between the font's height and the line height - it's 2 for front and 2 for bottom

float maxHeight = (FONT_SIZE+kPadding)*kNumberOfLinesYouNeed;
CGSize labelSize = [yourString sizeWithFont:yourFont constrainedToSize:CGSizeMake(kYourNeededWidth, maxHeight) lineBreakMode:UILineBreakModeWordWrap];
youLabel.frame=CGRectMake(yourX, yourY, kYourNeededWidth, maxHeight);

对不起,我很抱歉。 我已经写好了这个表格。

  ask by RaffAl translate from so

未解决问题?本站智能推荐:

12回复

从NSString删除http://

如何从NSString删除某些文本,例如“ http://”? 它必须完全按此顺序排列。 谢谢你的帮助! 这是我正在使用的代码,但是未删除http://。 而是显示http:// http://www.example.com 。 我该怎么办? 谢谢!
2回复

在NSString中是否有setwidth?

我想用固定宽度的空格追加我的字符​​串; 例如,我想以这种格式显示数据: 但这仅适用于相同长度的字符串。 如果字符串是这样的: 那么这不会修复空间。 这样我可以用相同数量的空格显示数据,我试过这个: 但这也行不通。 Objective-C是否具有类似于C ++和其
1回复

NSString值更改后-(id)init

好,所以有人告诉我,延迟 我的代码的一部分,但不幸的是,在字符串有时间注册更改之前,NSLogging NULL值。 这是我的ID初始化代码 } 这是控制台输出: 最初的NULL值来自应用程序启动,当它应该为null时(毕竟,为什么在启动时我需要字符串?),但
1回复

NSString比较不适用于iPAD

当我尝试在if条件中比较两个NSString时,遇到了这个奇怪而简单的问题。 它可以在iPhone上完美运行,但在iPad上却无法正常工作。 我有四个UITextFields ,都具有delegate = self 。 在textFieldShouldBeginEditing我返回NO并
1回复

NSString解析连续数据

早上好, 我正在从连接到iPad的串行设备上检索字节流。 连接后,提供的SDK将使用已转发的字节调用委托方法。 串行设备通过SDK转发的读数具有以下格式: 连接到串行设备后,委托的方法将立即开始接收数据-这可能处于各种完成状态,即 我需要做的是建立一种具体的方法,对
3回复

将省略号添加到NSString

我有以下代码,我试图使用核心文本绘制,这就是为什么我不能像UILabel那样剪切文本。 换句话说,我必须弄清楚我自己的省略号('...')。 我很难找到基于CGSize的'...'的范围。 解决这个问题的最佳方法是什么? 这是我绘制它的方式:
7回复

从NSString的左侧删除空格

我只需要从NSString的左边删除空白区域 如果我有" This is a good day"我会有"This is a good day" 仅限左侧空格 任何建议请
2回复

使用isEqualToString比较NSString

请,为什么isEqualToString不起作用?
3回复

如何将NSData作为NSString传递并将其取回?

我有一个NSData对象。 我想将其转换为字符串,传递给函数,然后重新转换回NSData对象。 但是怎么样? 我试过这个方法,但是NSData的价值与原版不同! 我的代码: 我怎样才能转换回原始的NSData? data和dataNM的大小不同。 编译器给
6回复

如何将时间值的NSString表示形式转换为包含小时和分钟的两个NSInteger形式?

我将深入研究iOS开发和Objective C语言,并构建一个闹钟应用程序以熟悉SDK和语言。 我有一个表示时间的NSString对象,范围为"1:00 am"到"12:59 am" 。 我需要将此NSString转换为两个包含小时值和分钟值的NSInteger 。 在执行此操作时,我发现