【问题标题】:UITextView prevent character wrap in between negative sign and numberUITextView 防止字符在负号和数字之间换行
【发布时间】:2012-06-19 08:42:57
【问题描述】:

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

当前行为:

答案 = -
123456789

相反,我希望它显示:

回答 =
-123456789

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

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

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

计算结果

-2

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

计算结果
是-2

【问题讨论】:

  • 根据您的要求使用核心文本

标签: iphone objective-c cocoa-touch uitextview word-wrap


【解决方案1】:

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

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;
}

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 有时答案的第一部分有几个词,并且本身也可能需要换行,所以换句话说,它可能看起来像这样:计算的结果
      is
      -2

      但在这种情况下,我宁愿将 -2 保留在单词“is”旁边
    • 哦,我明白了,“答案”部分不是固定的……那你应该把所有可能的情况放在纸上,然后做出决定。
    • 不过,将数值放在单独的标签上将确保该行在符号之后永远不会中断(因为它是前两个字符)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2016-10-26
        • 2012-08-30
        相关资源
        最近更新 更多