UITextView浮动蓝色框滚动时

我有一个禁用滚动的UITextView。 它在UIScrollView里面。 如果我input“fffs”,则出现一个小蓝框。 如果在显示该框时滚动,则该框不会消失,只是**浮在显示屏上,看起来像是一个明显的错误。

如果在启用滚动的情况下使用UITextView,只要UITextView开始滚动,该框就会隐藏起来。 我假设UITextView钩住它自己的滚动条的滚动事件,当它滚动时,隐藏那个滚动条。 当它在一些其他的UIScrollView里面的时候不会发生,所以我可能需要自己去做,但是我怎样才能让它隐藏那个盒子(也可能是其他的东西,比如应用自动校正)一个健壮的和非私有的API方式?

我可能会向苹果提交一个bug,但同时我希望有人能够快速修复。

*小蓝框=自动更正框/突出显示的东西 – 不确定究竟该怎么称呼它,也许为什么我找不到任何现有的答案。

**浮动=认为显​​示:固定在CSS中

更新:

我试过这个和scrollViewWillBeginDragging里面的一些其他变体:

UITextView *tv = GetFirstResponder(); // confirmed this returns correct value tv.autocorrectionType = UITextAutocorrectionTypeNo; [tv setNeedsDisplay]; [tv setNeedsLayout]; [tv setNeedsUpdateConstraints]; // just for giggles? 

我确认代码正在运行,而且我甚至没有添加代码来重新启用自动更正,所以我知道它没有被重新启用。 我也可以确认它是“工作”,因为当我点击另一个领域,然后回到原来的领域,自动更正现在被禁用。

我想如果我能find那个小蓝盒子的UIView,我可以隐藏/删除它。 我尝试在XCode中使用新的视图debugging,但它不捕获蓝色框,所以它必须是特殊的。

所有使用UITextView的人都以类似的方式使用UITextView(在键入内容时resize,不进行内部滚动),我很惊讶没有人知道这一点。 除非是一个全新的bug,否则我使用最新的iOS版本和我的两个testing设备(iPod 5和iPad)。

尝试将其autocorrectionType设置为UITextAutocorrectionTypeNo

这似乎工作到目前为止,但我还没有做了大量的testing:

 -(void) walkViews:(UIView*)v { NSString *className = NSStringFromClass([v class]); if([className isEqualToString:@"UIAutocorrectInlinePrompt"]) v.hidden = YES; NSArray *subviews = v.subviews; for(UIView *sv in subviews) [self walkViews:sv]; } -(void) scrollViewDidScroll:(UIScrollView *)scrollView { NSArray *windows = [UIApplication sharedApplication].windows; for (UIWindow *w in windows) { [self walkViews:w]; } } 

你可能想要一个更好的名字为“walkViews”,但基本上当UIScrollView滚动时,我find“小蓝盒子”的视图并隐藏它。 到目前为止,我有限的testing,如果我再次打字,需要的话,盒子会回来。 它似乎没有搞乱任何其他自动更正function。 仍然是一个黑客,并受到所有types的问题,但直到苹果可以修复这个错误,我可能会使用这个解决方法。

这似乎是一个苹果问题 。 作为解决方法,您可以在开始滚动时自动拒绝自动更正提示,如下所示。

注1:用Xamarin编写,但很容易翻译成Objective-C。

注2:拒绝自动更正提示的方法是从这里获取的 。

注3:你可以在这里findFindFirstResponder()方法。

 public override void ViewDidAppear(bool animated) { base.ViewDidAppear(animated); scrollView.DraggingStarted += scrollView_DraggingStarted; } public override void ViewWillDisappear(bool animated) { scrollView.DraggingStarted -= scrollView_DraggingStarted; base.ViewWillDisappear(animated); } void scrollView_DraggingStarted(object sender, EventArgs e) { UIView activeView = FindFirstResponder(View); if (activeView != null) { UITextView activeTextView = activeView as UITextView; if (activeTextView != null) { RejectAutocorrectPrompt(activeTextView); } } } private void RejectAutocorrectPrompt(UITextView textView) { string originalText = textView.Text; NSRange originalRange = textView.SelectedRange; CGPoint originalOffset = textView.ContentOffset; //Force any pending autocorrection to be applied textView.ResignFirstResponder(); textView.BecomeFirstResponder(); string finalText = textView.Text; if (originalText != finalText) { textView.Text = originalText; textView.SelectedRange = originalRange; textView.SetContentOffset(originalOffset, false); } }