0

我有一个 UITextView,我在其中显示计算结果。不幸的是,如果数字前面有一个负号,并且该数字靠近边缘,UITextView 会通过将其拆分为负号来包装数字,如下所示:

当前行为:

答案 = -
123456789

相反,我希望它显示:

答案 =
-123456789

在当前行为中,存在用户看不到减号并曲解答案的风险。

为了解决这个问题,我可以在答案前面强制换行,但有时整个字符串会放在一行上,在这种情况下,如果答案足够短,我宁愿把它全部放在一行上。有没有一种简单的方法可以防止 UITextView 在减号之间换行,还是我需要辞职以强制换行?

有时答案的第一部分有几个词,并且本身也可能需要换行,所以换句话说,如果我只是强制换行,它可能看起来像这样:

计算结果

-2

但在那种情况下,我宁愿在“is”一词旁边保留“-2”,这样它就会如下所示:

计算结果
为-2

4

4 回答 4

0

使用两个标签怎么样?仅当其宽度高于某个值时,您才能放置带有“向下一行”数字的那个...

编辑:你肯定需要两个标签。在确定每个文本之后,在两者上应用“sizeToFit”并流畅地布置它们,就像 HTML 内联元素一样:如果两者并排放置在一行中,很好;否则一个低于另一个。

UILabel 中不包含您想要的换行逻辑。你必须自己实现它。

(也许 UITextView 的行为略有不同?)

于 2012-06-16T15:51:14.227 回答
0

我想您可以解析前面带有负号的数字,然后\n在该数字前面插入换行符 ( )。UITextView 将接受换行符;我用过它们。

如果您想在数字足够小的情况下将数字保持在同一行,您将需要提出一种更优雅的方法来以编程方式确定数字是否有足够的字符留在一行,或者它是否已移动到两个.

于 2012-06-16T16:23:40.293 回答
0

为了呈现数字结果,最好的方法是使用 NSNumberFormatter 并且数字旁边总是有 - 符号。

于 2012-06-16T16:32:07.043 回答
0

谢谢大家的回答!这给了我一些想法,并且能够解决问题。我希望这可以帮助其他有类似问题的人。首先,再次澄清问题陈述,结果如下形式:

NSString * result = [NSString stringWithFormat:@"%@ = %@", answerString, answerNumber];

通过计算 UITextView 内容视图中的行数(How do I size a UITextView to its content?),我能够通过以下方法解决问题:

首先,比较有答案和没有答案的 UITextView 中的行数。如果行数不同,那么这意味着 UITextView 已经决定将结果换行,在这种情况下,我应该重新格式化结果以在数字前手动添加换行符,以确保负号(数字的一部分)是新行的第一个字符:

- (int) numberOfLines: (NSString *) result {

    UITextView *myTextView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 255, 0)];

    myTextView.text = result;

    CGRect frame = myTextView.frame;
    frame.size.height = myTextView.contentSize.height;
    myTextView.frame = frame;

    int numLines = myTextView.contentSize.height / myTextView.font.lineHeight;

    return numLines;
}

- (NSString *) formatResult: (NSString *) answerString answerNumber: (NSString *) answerNumber {

    NSString * resultWithoutAnswer = [NSString stringWithFormat:@"%@ = ", answerString];
    NSString * resultWithAnswer = [NSString stringWithFormat:@"%@ = %@", answerString, answerNumber];
    NSString * result = resultWithAnswer;

    if ([self numberOfLines:resultWithoutAnswer] != [self numberOfLines:resultWithAnswer]) {
        // If these are different, then UITextView has added a line break before the answer. To prevent UITextView from potentially splitting the number across the negative sign, manually add a line break to ensure that the negative sign shows on the same line as the number.
        result = [NSString stringWithFormat:@"%@ = \n%@", answerString, answerNumber];
    }
    return result;
}
于 2012-06-16T20:40:23.413 回答