编辑后(编辑时居中),UITextField中的文本向上移动
我有一个奇怪的问题。我有一个UITextField,用户应该在其中写入一些东西,所以这个字段被称为“amountField”。一切看起来都很好,当用户开始编辑文本框时,文本位于垂直和水平中心 - 这很好。编辑后(编辑时居中),UITextField中的文本向上移动
但是,当用户结束编辑时,文本向上移动一点点。我尝试了很多东西,没有任何帮助...
我在下面添加屏幕截图,所以你可以看到有什么问题。
这就是编辑字段时的样子 - 没关系。
,这是它的外观做编辑的时候 - 这是问题!
请,如果有人知道这是什么原因我将不胜感激! :)
这里是我的一些与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,没关系。
所以......
多小时的努力很多事情之后 - 我已经找到了问题。 在我的情况下,问题是字体。我真的不知道为什么,但字体的作者使字体变得怪异(领先等),底部有一个空白空间。我不知道为什么,但是当你编辑文本时,所有的文本属性都会被忽略,但是在完成编辑之后,它们就会被应用。
因此,如果您有类似的问题,请尝试将字体更改为Arial或类似的东西。
有关完整说明,请参考以下链接:link 1和link 2。在这些链接中推荐的解决方案可以避免很多令人头痛的问题,甚至可以应用于修复在开始编辑UITextField(使用系统字体或其他特定字体)时将文本移动到顶部的问题。
我也在使用自定义字体。奇怪。我的解决方案是在用户停止更新时更新字体框架,以确保它看起来垂直居中。 – 2012-03-14 17:31:20
高兴听到它帮助你:)(如果你愿意,你可以投票我的答案了) 你怎么更新字型框架?你能发布一些代码吗? :)谢谢,多米尼克 – 2012-03-14 18:47:14
而不是改变字体,试试这个。 http://stackoverflow.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;
}
}
感谢您的回答:)我在工作,当我回家时会尝试。 – 2012-03-14 08:32:42
这个黑客无法使用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);
}
这是一个有点哈克,但它得到工作完成。
您提供的解决方案我们只是一个黑客,它只适用于一种字体和大小,只要你改变字体的大小和/或字体的类型,错误就会回来。因此,它不是解决所有情况(字体类型,字体大小和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测试它虽然,利用这些:)
注时要小心:这种方法是“字体依赖”,用于偏移值可为每个字体变化和大小
是的,的确如此。还应该使用字体大小计算,但不同的字体可能会有不同的偏移量 – JakubKnejzlik 2014-12-25 11:06:39
有iOS 8.1中毛刺及以下,我不知道他们是否会稍后解决它,但当时没有一个独特的解决方案,解决所有的情况下,因为错误和解决方案是字体的类型,尺寸依赖。
一个该解决方案或低于这些解决方案能够解决您的问题的组合:
否则这等自给自足以下解决方案可以解决您的问题:
斯威夫特版本
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值可以为每个字体和大小而变化。
您能否解释为什么使用插页并返回text/editingText/placeholder的相同框架应该修复问题?在我的大多数情况下,问题是字体在返回相同的rects时渲染不正确(移动)。 – JakubKnejzlik 2014-12-25 11:25:12
@GrizzlyNetch设置insets是一个奇特的句子,意思是在UITextField中设置文本周围的填充。在这里,你可以找到一个单词插入的定义:http://www.thefreedictionary.com/inset – 2014-12-25 13:18:31
@格里芝加哥之后,如果它不适合你的第一枪是正常的,因为正如我在我的答案中所说:这方法是“与字体有关”,用于CGRectInset的值可能因字体和大小而异。 – 2014-12-25 13:21:33
当我设置文字&成为viewDidLoad
或viewWillAppear
的第一响应者时,发生了这个错误。当我将becomeFirstResponder
代码移动到viewDidAppear
时,错误消失了。
这加@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
}
我也遇到过,我连公司名称,用户名,密码都连续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
我在为iOS 8构建Xcode 6时遇到了这个问题。在我修复它之前,我升级到了Xcode 7并开始为iOS 9构建。然后我不再看到这个bug。 – peacetype 2015-10-17 00:37:58
我在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为我解决了它。
您的解决方案帮助了我。你能解释它为什么有效吗? – hoseokchoi 2017-05-07 14:57:38
我的猜测是,由于光标比文本高,并且当您使文本字段第一响应者和剪辑到边界被启用时,必须重绘文本以正确适合文本和光标。我们看到的是重绘。当禁用剪辑到界限时,您不再限制文本框的垂直位置,因此不会发生重绘或更新。 @ hoseokchoi – 2017-05-08 07:58:17
为我工作.. – 2017-07-06 12:11:40
这些解决方案上面并没有对me.My解决方案的工作是子类的UITextField并重写的setText:
- (void) setText:(NSString *)text {
[super setText:text];
[self layoutIfNeeded];
}
对此有何进展?看到了同样的问题,我的文本字段 – 2012-03-14 00:27:11
我很高兴我不是唯一的一个,我想,我能想到的...我会立即报告任何进展,因此继续检查这个问题:) – 2012-03-14 08:33:49
同样与无数的一切Pro字体 – erkanyildiz 2012-07-04 16:10:50