编辑后,UITextField中的文本向上移动(编辑时居中)

我有一个奇怪的问题。 我有一个UITextField中用户应该写的东西的数量,所以这个字段被称为“amountField”。 一切看起来都很好,当用户开始编辑文本字段时,文本处于垂直和水平中心 – 这太棒了。

但是,当用户结束编辑时,文本向上移动一点点。 我尝试了很多东西,没有任何帮助…

我正在添加下面的截图,所以你可以看到有什么问题。

这是编辑字段时的样子 – 没关系。

这是在编辑字段时 - 没关系。

这是编辑完成后的样子 – 这就是问题

这就是问题。

请,如果有人知道什么可能会导致这一点,我将不胜感激! 🙂

这里是一些与amountField相关的代码。

amountField.keyboardType = UIKeyboardTypeNumberPad; amountField.returnKeyType = UIReturnKeyDone; amountField.delegate = self; [amountField setFont:[UIFont fontWithName:@"Nuptial Script LT Std" size:30]]; amountField.borderStyle = UITextBorderStyleNone; UIImage *amountBg = [UIImage imageNamed:@"skin2_ipad_amountField.png"]; [amountField setBackground:amountBg]; amountField.rightView = nil; //amountField.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.2]; amountField.textAlignment = UITextAlignmentCenter; amountField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; amountField.adjustsFontSizeToFitWidth = YES; amountLabel.textColor = UIColorFromARGB(0x313030); //Using my own macro amountField.frame = CGRectMake(300, 480, 136, 32); amountField.center = CGPointMake(605, 439); 

PS:那些白色的angular落在那里,因为我把背景设置为0.2 alpha的白色,没关系。

我有一个类似的问题,开始在iOS 9上发生。 基本上我有一个集合视图单元格中的UITextField。 有时,当用户input和编辑结束时,文本“弹跳”,然后再次下降到正确的位置。 非常奇怪和烦人的故障。 简单地做这个调整解决了iOS 9上的问题,并certificate在iOS 7和8上是安全的:

  - (void)textFieldDidEndEditing:(UITextField *)textField { [textField layoutIfNeeded]; //Fixes iOS 9 text bounce glitch //...other stuff } 

所以…

经过很多小时的尝试,我发现了这个问题。 在我的情况下,问题是字体。 我真的不知道为什么,但字体的作者使字体奇怪(领先等),底部有一个空白。 我不知道为什么,但是当你编辑文本时,所有的文本属性都被忽略,但是在你完成编辑之后,它们就被应用了。

所以,如果你有类似的问题,尝试改变字体Arial或类似的东西。

有关详细解释,请参阅以下链接: 链接1和链接2 。 这些链接推荐的解决scheme可以避免你很多的麻烦,甚至可以用来解决像开始编辑UITextField(使用系统字体或其他特定的字体)的文本移动到顶部的问题。

为TextField禁用ClipsToBounds为我解决了它。

几乎每次使用自定义字体的应用程序的devise时,我都在努力解决这个问题。 一个select是修复字体(但这是太多的工作 – 至less对我来说:))。 我正在使用的第二个选项是inheritanceUITextField并重写editingRectForBounds:和placeholderRectForBounds:方法并更正偏移量。 它也应该适合你的情况。

 @implementation MyTextFieldWithFixedFontPosition -(CGRect)editingRectForBounds:(CGRect)bounds{ return CGRectOffset([self textRectForBounds:bounds], 0, 0.5); //0.5 is just example, you can adjust to any offset you like } -(CGRect)placeholderRectForBounds:(CGRect)bounds{ return [self editingRectForBounds:bounds]; } @end 

我还没有用leftView或rightViewtesting过,所以在使用这些时要小心:)

注意:这种方法是“依赖于字体的”,用于偏移量的值可能因字体和大小而异

这个错误发生在我身上,当我设置文本和成为第一响应者在viewDidLoadviewWillAppear 。 当我将becomeFirstResponder代码移到viewDidAppear ,错误就消失了。

我无法更改字体文件,所以当我解决这个问题时,我将原始UITextField的帧保存在一个属性中,并应用了以下代码:

 - (void)textFieldDidBeginEditing:(UITextField *)textField { textField.frame = self.usernameFrame; } - (void)textFieldDidEndEditing:(UITextField *)textField { textField.frame = CGRectOffset(self.usernameFrame, 0, 1); } 

这有点冒险,但它完成了工作。

在iOS 8.1及以下版本中有一个小故障,我不知道他们是否会在稍后修复它,但那时并没有一个能够解决所有情况的独特解决scheme,因为这个错误和解决scheme是字体types,尺寸相关的。

以下解决scheme之一或这些解决scheme的组合可以解决您的问题:

  • 改变字体的大小。

  • 改变字体的types

  • 更改UITextField的大小。

  • 反编译字体,修改字体特征并重新编译(更多解释请参考以下链接: 链接1和链接2 )。

否则,下面的其他自给自足的解决scheme可以解决您的问题:

Swift版本

 import UIKit class CustomTextField: UITextField { ... override func textRectForBounds(bounds: CGRect) -> CGRect { // Possible values. return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0)) } override func editingRectForBounds(bounds: CGRect) -> CGRect { // Possible values. return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0)) } override func placeholderRectForBounds(bounds: CGRect) -> CGRect { // Possible values. return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0)) } } 

这个解决scheme已经用leftViewtesting过,像一个魅力。

注意:这种方法是“依赖于字体”,用于CGRectInset的值可能因字体和大小而异。

我有一个embedded在UITableViewCellUITextfield类似的问题。 这个代码在你的项目中究竟在哪里? 我相信正在发生的事情是,当你完成编辑一个特定的文本字段后,它发送自己-setNeedsDisplay和它的drawRect:随后被调用。 这可能解释了协调的转变。 在我特殊的情况下,我不得不使用表视图委托方法-willDisplayCell …来设置内容alignment。 我将不得不更多地了解你的devise可能提供的build议。

一个可能的解决scheme是使用文本字段委托方法来设置内容alignment。

 -(void)textFieldDidEndEditing:(UITextField *)textField{ if (amountField == textField){ amountField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; } } 

如果有一行代码,检查键盘更改popup窗口的位置self.view.layoutIfNeeded self.view.layoutIfNeeded()删除它。祝你好运!

我通过给我的UITextFields添加高度约束来解决这个问题。

这是因为文本字段的BaselineOffset发生了变化。 在UITextFieldDidEndEditing ,使用NSBaselineOffset:0创build一个属性文本,并使用该attributedText文本可以解决问题。

 -(IBAction)txtFieldDidEndEditing:(UITextField *)sender { NSDictionary *style = @{ NSBaselineOffsetAttributeName: @(0) }; self.txtField.attributedText = [[NSAttributedString alloc] initWithString:self.txtField.text attributes:style]; } 

上述解决scheme不适合我。我的解决scheme是子类UITextField并覆盖setText:

 - (void) setText:(NSString *)text { [super setText:text]; [self layoutIfNeeded]; }