【问题标题】:UITextView cursor not positioning properly when editing in iOS 7. Why?在 iOS 7 中编辑时 UITextView 光标无法正确定位。为什么?
【发布时间】:2013-10-16 02:17:06
【问题描述】:

上面那个黄色框是一个可编辑的 UITextView,当前正在编辑(是第一响应者)。但你可能分不清吧?因为没有游标。但是有……就是黄色textView左下角的那个小蓝点。它略低于 textViews 底部边框。因此,如果我继续换行或按 Enter 键,文本将自然向上移动。但是光标永远不会是“水平”的,也不会在 UITextView 的底部边框上方。它总是只是勉强从底部伸出,在边界下方几个点。

为什么?这在 iOS 6 中不是问题。有什么办法可以解决这个问题?

【问题讨论】:

  • 我遇到了同样的情况,我将 uitextview 设置为可滚动的,它开始为我工作。它有点奇怪,但对我有用。

标签: ios uiscrollview ios7 uitextview


【解决方案1】:

这个bug在iOS 7.0中你可以通过修改textView的委托方法来解决。

试试下面的代码

- (void)textViewDidChange:(UITextView *)textView {
    CGRect line = [textView caretRectForPosition:
        textView.selectedTextRange.start];
    CGFloat overflow = line.origin.y + line.size.height
        - ( textView.contentOffset.y + textView.bounds.size.height
        - textView.contentInset.bottom - textView.contentInset.top );
    if ( overflow > 0 ) {
    // We are at the bottom of the visible text and introduced a line feed, scroll down (iOS 7 does not do it)
    // Scroll caret to visible area
        CGPoint offset = textView.contentOffset;
        offset.y += overflow + 7; // leave 7 pixels margin
    // Cannot animate with setContentOffset:animated: or caret will not appear
        [UIView animateWithDuration:.2 animations:^{
            [textView setContentOffset:offset];
        }];
    }
}

你的问题会解决的。

【讨论】:

  • 这在将光标设置在文本视图的末尾是正确的,但是当您输入字符时这里会出现问题.. 当您输入时它会上升,当您停止时它会下降。它似乎对眼睛有刺激性.. 有什么解决办法吗?
  • 它对我来说很好,我没有像你说的那样遇到问题。
  • Pratik 的答案在 CGRect line = [textView caretRectForPosition:textView.selectedTextRange.start] 处崩溃,其中 line.origin.y 作为 inf 返回。有人解决了这个崩溃问题吗?
  • @Any one:为什么我们需要7像素的边距?确定了吗?
  • @Shilpi 完全正确,此代码在某些情况下会崩溃。不过,我还没有充分调试它。在进一步调试之前,将 if 语句设为 if (overflow > 0 && !isnan(line.origin.y) && !isinf(line.origin.y)) 可能就足够了,这至少可以防止文本视图的 setContentOffset: 内部崩溃。
【解决方案2】:

如果您在导航控制器场景中,我认为这实际上是 iOS 7 中引入的一个属性的结果:automaticallyAdjustsScrollViewInsets(参见iOS 7 transition guide

这默认为 YES,并且会尝试通过调整导航控制器高度的滚动偏移来巧妙地使用 UITextView(它本身就是一个滚动视图)。

因此,解决方案是在您的 viewDidLoad 中将此属性设置为 NO(注意不要在 iOS 6 上调用它,因为它仅在 iOS 7 中可用)。

【讨论】:

    【解决方案3】:

    根据 Todd 给出的答案,您可以在应用程序完成启动时运行的方法中添加这样的内容:

       [[UITextView appearance] setTintColor:[UIColor redColor]];
       [[UITextField appearance] setTintColor:[UIColor redColor]];
    

    这将影响所有的 UITextFields 和 UITextViews。

    【讨论】:

    • 更改色调颜色与光标位置有什么关系?
    • 我来到这里是为了寻找我的隐形光标的解决方案,我发现托德的回答解决了我的问题。我添加了这个答案作为对托德答案的改进。
    【解决方案4】:
    - (BOOL) textView:(UITextView *)sender shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
        NSString * newText = [sender.text stringByReplacingCharactersInRange:range withString:text];
        [self setFramesForText:newText];
    
        if (!IOS_VERSION_6_OR_LESS) {
            if ([text isEqualToString:@"\n"]){
                [textView setContentOffset:CGPointMake(textView.contentOffset.x, 999999999)];
            }
        }
    
        return YES;
    }
    

    【讨论】:

      【解决方案5】:

      你只需要设置 UITextView 的 tintColor。

      在代码中添加如下内容(我将其放在 viewDidLoad 中)对我有用。

      self.textView.tintColor = [UIColor redColor];
      

      【讨论】:

      • 目前为止最好的解决方案。
      • 这会改变光标的颜色...这是如何解决问题的?
      • 我非常渴望修复与 iOS 7 中的 UITextView 相关的问题,以至于我实际上尝试了这个解决方案。红色不起作用,但橙色起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2013-02-17
      • 1970-01-01
      • 2014-07-06
      • 2015-03-21
      • 2015-07-10
      相关资源
      最近更新 更多