有没有一种方法可以控制在UITextField
中输入时弹出的自动纠正视图的位置?
默认情况下,它似乎总是出现在文本框下方。但是在苹果的应用程序(如短信)中,它有时会出现在文本框上方。
对于位于键盘正上方的文本字段,自动更正被键盘挡住,无法使用。
有没有一种方法可以控制在UITextField
中输入时弹出的自动纠正视图的位置?
默认情况下,它似乎总是出现在文本框下方。但是在苹果的应用程序(如短信)中,它有时会出现在文本框上方。
对于位于键盘正上方的文本字段,自动更正被键盘挡住,无法使用。
自动更正提示的位置是由UITextInput协议的firstRect...方法确定的。不幸的是,UITextField使用一个私有类作为该协议的代理,因此您无法子类化和覆盖它。
但是,您可以通过自己绘制内容(如使用CoreText),实现自己的选择和放大镜处理,然后您就可以影响自动更正提示的位置。虽然它被设计为始终位于编辑文本下方,因此您必须在firstRect...方法上基本上撒谎。
长话短说:这太麻烦了。
这里是一个使用私有API的解决方案,因为没有公共API可以完成这个任务。
使用交换过的 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;
}
}
}
}
}
}
更多细节请查看。
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做同样的事情