编辑后,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过,所以在使用这些时要小心:)
注意:这种方法是“依赖于字体的”,用于偏移量的值可能因字体和大小而异
这个错误发生在我身上,当我设置文本和成为第一响应者在viewDidLoad
或viewWillAppear
。 当我将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在UITableViewCell
的UITextfield
类似的问题。 这个代码在你的项目中究竟在哪里? 我相信正在发生的事情是,当你完成编辑一个特定的文本字段后,它发送自己-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]; }