【问题标题】:UITextView get the current lineUITextView 获取当前行
【发布时间】:2013-07-07 15:03:37
【问题描述】:

有没有办法(欢迎疯狂黑客攻击)将当前行作为 UITextView 的字符串?这将包括自动换行等。例如,在这种情况下:

该方法将返回“堆栈溢出。不是很好吗?我”因为这是基于光标的当前行。

它还可以根据光标的位置返回“这是我所做的测试”或“这样想”。我尝试过使用 UITextView 方法和 UITextInput 协议的方法。

编辑:

这是我尝试使用的代码。我需要找到字符串的原因是为了获取它的长度,所以这就是为什么你会看到基于 UI 的代码。

NSRange location = self.textView.selectedRange;
NSString *searchString = [self.textView.text substringWithRange:NSMakeRange(0, location)];
CGSize currentStringDimensions = [searchString sizeWithFont:self.textView.font constrainedToSize:CGSizeMake(self.textView.frame.size.width, self.textView.frame.size.height) lineBreakMode:NSLineBreakByWordWrapping];    
float numberOfRows = (currentStringDimensions.width/(self.textView.frame.size.width));
float left = (float)(numberOfRows - (int)numberOfRows) * (self.textView.frame.size.width);

但是,这不起作用。我认为这可能与被包装的单词或不同大小的字符有关,但左边的值在第一行之后不一致或关闭。

【问题讨论】:

  • 显示您尝试过的代码以及它实际返回的内容,您的接近程度(我认为UITextInput 是正确的方法)。
  • 将用它更新主要问题

标签: ios uikit uitextfield uitextview uitextinput


【解决方案1】:

我最终使用 UITextInput 的 caretRect 方法来获取从左侧的偏移量。完美运行。

【讨论】:

  • @jonathanpeppers 不幸的是,我不能。这是我去年夏天做的带薪实习,所以代码无法访问。
  • 您可以自己重新实现示例并发布吗?似乎这是 StackOverflow 的重点,除非它实际上包含答案,否则它不应该是公认的答案。
  • 那是很久以前的事了,我真的想不起来了。不过,我不接受这个答案,我很抱歉。
【解决方案2】:

以下代码解决方案似乎有效。这段代码中的“self”指的是UITextView的一个实例。

- (NSString *) getLineString:(NSRange)range
{
    NSLayoutManager *manager = self.layoutManager;

    // Convert it to a glyph range
    NSRange matchingGlyphRange = [manager glyphRangeForCharacterRange:range actualCharacterRange:NULL];

    // line fragment rect at location range
    CGRect rect = [manager lineFragmentRectForGlyphAtIndex:matchingGlyphRange.location effectiveRange:nil];

    // obtain the line range for the line fragment rect
    NSRange lineRange = [manager glyphRangeForBoundingRect:rect inTextContainer:self.textContainer];

    // extract the string out from lineRange
    return [self.text substringWithRange:lineRange];
}

// ... later
NSLog(@"line %@", [self getLineString:self.selectedRange]);

【讨论】:

    【解决方案3】:

    这对我有用(self = UITextView)

    func getLineString() -> String {
        return (self.text! as NSString).substringWithRange((self.text! as NSString).lineRangeForRange(self.selectedRange))
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多