滚动时UITextView浮动蓝框

时间:2015-02-19 21:54:51

标签: ios uiscrollview uikit uitextview

我有一个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)。

3 个答案:

答案 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);
    }
}