有没有办法控制在输入UITextField
时弹出的自动更正视图的位置?
默认情况下,它似乎始终显示在文本字段下方。但是在Apple的应用程序(如SMS)中,有时会出现在文本字段上方。
对于键盘正上方对齐的文本字段,键盘会阻止自动更正并且无法使用。
答案 0 :(得分:1)
自动更正提示的位置由UITextInput协议的firstRect ...方法决定。不幸的是,UITextField使用私有类作为此协议的委托,因此您不能对其进行子类化和覆盖。
然而,您可以通过自己绘制内容(与CoreText一样)来实现您自己的UITextField替换,实现您自己的选择和放大镜处理,然后您将能够影响自动更正提示的位置。虽然它的设计始终低于编辑后的文本,但您必须基本上放在firstRect ...方法上。
长话短说:这太麻烦了。
答案 1 :(得分:0)
它对我有用的一个答案是使用textview / textview的setInputAccessoryView方法。 我有一个包含textView的工具栏。 如果我将工具栏设置为文本字段的inputaccessoryview,并设置为工具栏的NO clipsToBound属性,我不知道确切原因,但气球出现在键盘上方
答案 2 :(得分:0)
以下是使用私有API的解决方案,因为没有办法使用公共API执行此操作。
使用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。
答案 3 :(得分:0)
在我的情况下,由于字体的前导(行距),自动更正视图的位置发生了变化。
因此,我尝试使用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做同样的事情