23

为什么会发生这样的事情

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

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

4

5 回答 5

41

这个错误在 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];
        }];
    }
}

你的问题会解决的。

于 2013-10-10T14:06:09.093 回答
3

如果您在导航控制器场景中,我认为这实际上是 iOS 7 中引入的属性的结果:(automaticallyAdjustsScrollViewInsets请参阅iOS 7 过渡指南

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

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

于 2014-08-20T21:17:15.527 回答
-1
- (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;
}
于 2013-12-11T13:41:50.327 回答
-1

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

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

这将影响所有 UITextFields 和 UITextViews。

于 2013-10-25T11:32:27.450 回答
-3

您只需要设置 UITextView 的 tintColor。

在对我有用的代码中(我把它放在 viewDidLoad 中)放入类似下面的内容。

self.textView.tintColor = [UIColor redColor];
于 2013-10-21T23:27:43.553 回答