我有一个UITextView,滚动禁用。它位于UIScrollView中。如果我输入“fffs”,则会出现一个*蓝色小框。如果我在显示该框的情况下滚动,则该框不会消失,它只会漂浮在显示屏上,看起来像一个明显的错误。
如果我在启用滚动的情况下使用UITextView,则只要UITextView开始滚动就会隐藏该框。我假设UITextView挂钩它自己的滚动条的滚动事件,当它有它们时,并在滚动时隐藏该框。当它在其他一些UIScrollView中时不会发生这种情况,所以我可能需要自己做,但是如何让它隐藏那个框(也许还有其他任何通常会应用自动修正的东西) - 在一种强大的非私有API方式?
我可能会向Apple提交一个错误,但与此同时我希望有人能快速修复。
*小蓝框=自动纠正框/突出显示的内容 - 不确定究竟要调用它,也许为什么我找不到任何现有答案。
** floats =想想显示:在CSS中修复
更新
我在scrollViewWillBeginDragging中尝试了这个以及其他一些变体:
UITextView *tv = GetFirstResponder(); // confirmed this returns correct value
tv.autocorrectionType = UITextAutocorrectionTypeNo;
[tv setNeedsDisplay];
[tv setNeedsLayout];
[tv setNeedsUpdateConstraints]; // just for giggles?
我确认代码正在运行,我甚至没有费心添加代码来重新启用自动更正,所以我知道它没有被重新打开。我也可以确认它“有效”,因为当我点击另一个字段,然后返回原始字段时,现在禁用自动更正。
我在想如果能找到那个小蓝框的UIView,我可以隐藏/删除它。我尝试在XCode中使用新的View Debugging,但它没有捕获蓝框,所以它必须是特殊的。
所有人都以类似于我的方式使用UITextView(在你输入时调整大小,没有内部滚动),我很惊讶没有人想到这一点。除非它是一个全新的错误,否则我将使用最新的iOS版本和我的两个测试设备(iPod 5和iPad)。
答案 0 :(得分:1)
尝试将autocorrectionType
设置为UITextAutocorrectionTypeNo
。
答案 1 :(得分:0)
到目前为止这似乎有效,但我还没有做过大量的测试:
-(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滚动时,我找到“小蓝盒子”的视图并隐藏它。到目前为止,我的有限测试,如果我再次开始输入并且需要它,盒子会回来。它似乎也没有弄乱任何其他自动更正功能。仍然是一个黑客,并受到这类事件带来的所有问题的影响,但在Apple可以解决这个问题之前,我可能会使用这种解决方法。
答案 2 :(得分:0)
这似乎是Apple issue。作为解决方法,您可以在开始滚动时自动拒绝自动更正提示,如下所示。
注1:用Xamarin编写,但很容易翻译成Objective-C。
注2:拒绝自动更正提示的方法取自here。
注3:您可以找到FindFirstResponder()方法here。
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);
}
}