iOS中,当UITextField的文本发生变化时,其位置会改变。

3

我使用这个方法将文本字段居中于相关位置:

[textField setCenter:[someObject center]];
[textField becomeFirstResponder];

这看起来很棒,漂亮地居中于对象之上,准备接受文本。我希望文本以特定的方式格式化,因此在编辑更改处理程序中,我修改文本并设置为新文本:

[textField setText:newText];

当我这样做时,文本字段会跳回到它居中之前的位置。我希望文本字段可以保持在物体上方并居中。

我的经验是可能有更好的方法来实现这一点,例如移动文本字段并动态更改其内容,而无需解决各种怪异问题。有什么建议吗?


1
只是一个想法,你是否正在使用自动布局?如果是这样,请尝试关闭它并查看错误是否仍在发生。 - Amy Worrall
有没有办法仅针对控件关闭自动布局? - Yimin Rong
不是的,这是每个xib文件的设置。 - Amy Worrall
好的,我找到了一种使用replaceRange:withText:和UITextPosition以及UITextRange类解决问题的方法,并将其设置为第一个响应者,其中也可能有一只梨树上的鹧鸪。 - Yimin Rong
关闭自动布局对我有用。谢谢@AmyWorrall。 - Henry Rillovian
2个回答

2

如果您想在编辑时格式化UITextField,可以尝试以下代码。

-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    if([string isEqualToString:@"4"]){
        UITextRange *range=textField.selectedTextRange;
        [textField replaceRange:range withText:@"Hi"];
        return NO;
    }
    return YES;
}

我将UITextfield设置为居中对齐。当它检测到以"4"开头的字符时,无论是在中间还是其他位置,它都会用"Hi"替换它,并保持居中对齐的行为。


已确认使用setText:它仍然会移动文本字段。使用replaceRange可能有效,但我需要完全更改文本,而不仅仅是替换范围。进一步研究后发现,这似乎非常困难:没有简单的方法创建包含整个字符串的UITextRange,需要子类化两个类UITextRange和UITextPosition,textField需要成为第一个响应者。即使我完成了所有这些工作,我仍然不知道文本字段是否会移动。 - Yimin Rong

0
除了上面的代码之外,还使用以下内容来替换现有文本:
UITextPosition *p0 = [textField beginningOfDocument];
UITextPosition *p1 = [textField positionFromPosition:p0 offset:[[textField text] length]];
UITextRange *complete = [textField textRangeFromPosition:p0 toPosition:p1];
[textField replaceRange:complete withText:newText];

对于本应该是易如反掌的任务,这个解决方案实在是太可怕了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接