上面的黄色框是一个可编辑的UITextView,目前正在进行编辑(是第一响应者)。但你可能看不出来,因为没有光标。但实际上有光标……它就是位于黄色textView左下角的那个小蓝点。它略低于textView的底部边界。因此,如果我继续换行或按回车键,文本将自然地向上移动。但光标从未“水平”,或在UITextView的底部边界正上方。它总是刚好从底部探出来,比边界低几个点。
为什么?这在iOS 6中不是问题。有任何方法可以解决这个问题吗?
上面的黄色框是一个可编辑的UITextView,目前正在进行编辑(是第一响应者)。但你可能看不出来,因为没有光标。但实际上有光标……它就是位于黄色textView左下角的那个小蓝点。它略低于textView的底部边界。因此,如果我继续换行或按回车键,文本将自然地向上移动。但光标从未“水平”,或在UITextView的底部边界正上方。它总是刚好从底部探出来,比边界低几个点。
为什么?这在iOS 6中不是问题。有任何方法可以解决这个问题吗?
这个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];
}];
}
}
您的问题将会得到解决。
if (overflow > 0 && !isnan(line.origin.y) && !isinf(line.origin.y))
应该足以防止文本视图的setContentOffset:
内部崩溃。 - smileyborgautomaticallyAdjustsScrollViewInsets
(请参见iOS 7过渡指南)。viewDidLoad
中将此属性设置为NO(要小心不要在iOS 6上调用它,因为它仅适用于iOS 7及以上版本)。 [[UITextView appearance] setTintColor:[UIColor redColor]];
[[UITextField appearance] setTintColor:[UIColor redColor]];
这将影响所有的UITextFields和UITextViews。
- (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;
}
您只需要设置UITextView的tintColor即可。
将以下内容放入代码中(我将其放在了viewDidLoad中),对我来说起作用。
self.textView.tintColor = [UIColor redColor];