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

问题描述:

我有一个奇怪的问题。我有一个UITextField,用户应该在其中写入一些东西,所以这个字段被称为“amountField”。一切看起来都很好,当用户开始编辑文本框时,文本位于垂直和水平中心 - 这很好。编辑后(编辑时居中),UITextField中的文本向上移动

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

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

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

This is while editing the field - that's ok.

,这是它的外观做编辑的时候 - 这是问题

This is the problem.

请,如果有人知道这是什么原因我将不胜感激! :)

这里是我的一些与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:那些白色的角落在那里,因为我把背景设置为白色0.2 alpha,没关系。

+1

对此有何进展?看到了同样的问题,我的文本字段 – 2012-03-14 00:27:11

+0

我很高兴我不是唯一的一个,我想,我能想到的...我会立即报告任何进展,因此继续检查这个问题:) – 2012-03-14 08:33:49

+0

同样与无数的一切Pro字体 – erkanyildiz 2012-07-04 16:10:50

所以......

多小时的努力很多事情之后 - 我已经找到了问题。 在我的情况下,问题是字体。我真的不知道为什么,但字体的作者使字体变得怪异(领先等),底部有一个空白空间。我不知道为什么,但是当你编辑文本时,所有的文本属性都会被忽略,但是在完成编辑之后,它们就会被应用。

因此,如果您有类似的问题,请尝试将字体更改为Arial或类似的东西。

有关完整说明,请参考以下链接:link 1link 2。在这些链接中推荐的解决方案可以避免很多令人头痛的问题,甚至可以应用于修复在开始编辑UITextField(使用系统字体或其他特定字体)时将文本移动到顶部的问题。

+0

我也在使用自定义字体。奇怪。我的解决方案是在用户停止更新时更新字体框架,以确保它看起来垂直居中。 – 2012-03-14 17:31:20

+0

高兴听到它帮助你:)(如果你愿意,你可以投票我的答案了) 你怎么更新字型框架?你能发布一些代码吗? :)谢谢,多米尼克 – 2012-03-14 18:47:14

+5

而不是改变字体,试试这个。 http://*.com/a/10087220/244183 – McDJ 2012-04-10 10:43:53

我有一个UITextfield嵌入在UITableViewCell类似的问题。这个代码究竟位于您的项目中?我相信发生的事情是,在完成编辑特定文本字段后,它会自动发送-setNeedsDisplay,并随后调用它的drawRect:。这可能解释了对齐方式的转变。在我的特定情况下,我必须使用表格视图委托方法-willDisplayCell ...来设置内容对齐。我将不得不更多地了解您的设计,以便提供建议。

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

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

感谢您的回答:)我在工作,当我回家时会尝试。 – 2012-03-14 08:32:42

+1

这个黑客无法使用Xcode 6.1和ios 8.1。 – 2014-12-22 15:00:00

我无法更改字体文件,所以当我解决了这个我在属性保存原来的UITextField的框架和应用下面的代码:

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    textField.frame = self.usernameFrame; 
} 

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

这是一个有点哈克,但它得到工作完成。

+0

您提供的解决方案我们只是一个黑客,它只适用于一种字体和大小,只要你改变字体的大小和/或字体的类型,错误就会回来。因此,它不是解决所有情况(字体类型,字体大小和UITextField高度的组合)的解决方案,它只是一种临时修复特定情况下的缺陷的黑客攻击。对于这个问题的其他解决方案就像我上面提到的那样(请参阅我的答案),在界面构建器中反编译和修改字体和/或更改字体的类型和/或字体大小和/或UITextField的高度。 – 2014-12-24 09:47:50

我这个问题时,应用程序的设计是自定义字体几乎每一次挣扎。一种选择是修复字体(但这是太多的工作 - 至少对我来说:))。我使用的是第二个选项是子类的UITextField和重写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或rightView测试它虽然,利用这些:)

注时要小心:这种方法是“字体依赖”,用于偏移值可为每个字体变化和大小

+0

是的,的确如此。还应该使用字体大小计算,但不同的字体可能会有不同的偏移量 – JakubKnejzlik 2014-12-25 11:06:39

有iOS 8.1中毛刺及以下,我不知道他们是否会稍后解决它,但当时没有一个独特的解决方案,解决所有的情况下,因为错误和解决方案是字体的类型,尺寸依赖。

一个该解决方案或低于这些解决方案能够解决您的问题的组合:

  • 更改字体的大小。

  • 更改字体的类型。

  • 更改UITextField的大小。

  • 反编译有问题的字体,修改字体的特性并重新编译(更多解释,请参考以下链接:link 1link 2)。

否则这等自给自足以下解决方案可以解决您的问题:

斯威夫特版本

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)) 
    } 

} 

该解决方案已经过测试,leftView和工程就像一个魅力。

注:此方法是“字体依赖”,用于CGRectInset值可以为每个字体和大小而变化。

+0

您能否解释为什么使用插页并返回text/editingText/placeholder的相同框架应该修复问题?在我的大多数情况下,问题是字体在返回相同的rects时渲染不正确(移动)。 – JakubKnejzlik 2014-12-25 11:25:12

+0

@GrizzlyNetch设置insets是一个奇特的句子,意思是在UITextField中设置文本周围的填充。在这里,你可以找到一个单词插入的定义:http://www.thefreedictionary.com/inset – 2014-12-25 13:18:31

+0

@格里芝加哥之后,如果它不适合你的第一枪是正常的,因为正如我在我的答案中所说:这方法是“与字体有关”,用于CGRectInset的值可能因字体和大小而异。 – 2014-12-25 13:21:33

当我设置文字&成为viewDidLoadviewWillAppear的第一响应者时,发生了这个错误。当我将becomeFirstResponder代码移动到viewDidAppear时,错误消失了。

+1

这加@n8tr的答案也为我解决了一些其他奇怪的问题。推荐。 – 2016-05-10 21:38:28

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

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

我也遇到过,我连公司名称,用户名,密码都连续3个UITextField。但是我的症状不仅仅出现在iOS 9上,还出现在iOS 8上。我怀疑它与Xcode 7.0有关吗?在iOS 8.3,8.4模拟器上也会发生。没有8.x设备进行测试。但是您的解决方案适用于两个版本。这就是为什么我认为它与Xcode 7或iOS 9 SDK有关。 – Wingzero 2015-10-16 07:11:35

+1

我在为iOS 8构建Xcode 6时遇到了这个问题。在我修复它之前,我升级到了Xcode 7并开始为iOS 9构建。然后我不再看到这个bug。 – peacetype 2015-10-17 00:37:58

+0

我在iOS 9.0.2上经历过同样的事情 – wasabi 2015-10-20 20:12:03

检查键盘更改弹出的位置的看法,如果有代码self.view.layoutIfNeeded()行删除它,祝你好运!

我加入高度约束我UITextFields固定这一点。

这是因为BaselineOffset的文本框得到了改变。 在UITextFieldDidEndEditing创建与NSBaselineOffset的属性文本:0和使用attributedText会解决这个问题。

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

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

+0

您的解决方案帮助了我。你能解释它为什么有效吗? – hoseokchoi 2017-05-07 14:57:38

+2

我的猜测是,由于光标比文本高,并且当您使文本字段第一响应者和剪辑到边界被启用时,必须重绘文本以正确适合文本和光标。我们看到的是重绘。当禁用剪辑到界限时,您不再限制文本框的垂直位置,因此不会发生重绘或更新。 @ hoseokchoi – 2017-05-08 07:58:17

+0

为我工作.. – 2017-07-06 12:11:40

这些解决方案上面并没有对me.My解决方案的工作是子类的UITextField并重写的setText:

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