【问题标题】:Controlling AutoCorrect View Position on iPhone在 iPhone 上控制自动更正视图位置
【发布时间】:2009-05-26 15:31:26
【问题描述】:

有没有办法控制在输入UITextField 时弹出的自动更正视图的位置?

默认情况下,它似乎总是出现在文本字段下方。然而,在像 SMS 这样的 Apple 应用程序中,它有时会出现在文本字段上方。

对于在键盘正上方对齐的文本字段,自动更正会被键盘阻止并且无法使用。

【问题讨论】:

  • 撞! 1年后有答案吗?
  • 从技术上讲这是不可能的,并且没有允许这样做的公共 API。但是,可以修改修正弹窗的位置:弹窗是文本区域的子视图,因此可以通过遍历子视图找到。您可以找到它的原始位置并将其移动到任何地方。将此逻辑放入一个方法中,并在每次调用文本字段的“layoutSubviews”时调用它......我还没有看到更清洁的解决方案

标签: iphone objective-c


【解决方案1】:

自动更正提示的位置由 UITextInput 协议的 firstRect... 方法决定。不幸的是 UITextField 使用一个私有类作为这个协议的委托,所以你不能继承和覆盖它。

但是,您可以通过自己绘制内容(如使用 CoreText)来实现您自己的 UITextField 替换,实现您自己的选择和放大镜处理,然后您将能够影响自动更正提示的位置。尽管它被设计为始终位于编辑后的文本下方,但您基本上必须依赖 firstRect ... 方法。

长话短说:太麻烦了。

【讨论】:

    【解决方案2】:

    对我有用的一个答案是使用 textview/textview 的 setInputAccessoryView 方法。 我有一个包含 textView 的工具栏。 如果我将工具栏设置为文本字段的 inputaccessoryview,并设置为工具栏的 NO clipsToBound 属性,我不知道确切原因,但气球出现在键盘上方

    【讨论】:

    • 您是否能够弄清楚如何让它显示在...上方正在编辑的字段而不是下方?。谢谢!
    【解决方案3】:

    这是一个使用私有 API 的解决方案,因为没有办法使用公共 API 来做到这一点。

    • 通过应用程序的 -windows 属性查找私有 UITextEffectsWindow 窗口并找出其框架。这是键盘
    • 通过 TextView 的子视图查找私有 UIAutocorrectInlinePrompt 视图。这是自动更正气泡。
    • 将该子视图移动到单独的包装视图(添加到 TextView)中,然后移动该包装视图,使其位于上述键盘窗口的上方。

    使用 swizzled 的 layoutSubViews,

    - (void) moveSpellingCorrection {
    for (UIView *view in self.subviews)
    {
        if ([[[view class] description] isEqualToString:@"UIAutocorrectInlinePrompt"])
        {
            UIView *correctionShadowView = nil; // [view correctionShadowView];
    
            for (UIView *subview in view.subviews)
            {
                if ([[[subview class] description] isEqualToString:@"UIAutocorrectShadowView"])
                {
                    correctionShadowView = subview;
                    break;
                }
            }
    
            if (correctionShadowView)
            {
                UIView *typedTextView = nil; //[view typedTextView];
                UIView *correctionView = nil; //[view correctionView];
    
                for (UIView *subview in view.subviews)
                {
                    if ([[[subview class] description] isEqualToString:@"UIAutocorrectTextView"])
                    {
                        if (CGRectContainsRect(correctionShadowView.frame,subview.frame))
                        {
                            correctionView = subview;
                        }
                        else
                        {
                            typedTextView = subview;
                        }
                    }
    
                }
                if (correctionView && typedTextView)
                {
    
                    CGRect textRect = [typedTextView frame];
                    CGRect correctionRect = [correctionView frame];
                    if (textRect.origin.y < correctionRect.origin.y)
                    {
                        CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0,-50.0);
                        [correctionView setTransform: moveUp];
                        [correctionShadowView setTransform: moveUp];
    
                        CGRect windowPos = [self convertRect: view.frame toView: nil ];
                        [view removeFromSuperview];
                        [self.window addSubview: view];
                        view.frame = windowPos;
                    }
    
                }
            }
    
        }
    
    }
    

    }

    更多详情check

    【讨论】:

      【解决方案4】:

      在我的例子中,自动更正视图的位置由于字体的前导(行间距)而发生了偏移。

      所以,我尝试使用 firstRect 函数将其移到前导 px 上,如下代码所示。

      class CustomTextView: UITextView {
          override var font: UIFont? {
              didSet {
                  if let font = font {
                      leadingFont = font.leading
                  } else {
                      leadingFont = 0
                  }
              }
          }
          var leadingFont: CGFloat = 0
      
          override func firstRect(for range: UITextRange) -> CGRect {
              var newRect = super.firstRect(for: range)
              newRect.origin = CGPoint(x: newRect.origin.x, y: newRect.origin.y - leadingFont)
              print("newRect: \(newRect)")
              return newRect
          }
      }
      

      虽然是 UITextView 但你可以用 UITextField 做同样的事情

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多