Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 什么';在输入文本时保持UITextField居中,动态调整UITextField大小的正确方法是什么?_Ios_Ios7_Uitextfield_Autolayout - Fatal编程技术网

Ios 什么';在输入文本时保持UITextField居中,动态调整UITextField大小的正确方法是什么?

Ios 什么';在输入文本时保持UITextField居中,动态调整UITextField大小的正确方法是什么?,ios,ios7,uitextfield,autolayout,Ios,Ios7,Uitextfield,Autolayout,给定一个textfield,我希望它在用户键入文本时动态调整水平大小。我还希望它在superview中保持居中。我偶然发现了一种方法,但它似乎是人为的,不太可能是正确的方法。我觉得这里缺少了一些简单的东西,比如文本字段的属性、控件或一些我不熟悉的协议 在Interface Builder中,我有一个UITextField,文本为“\”。它有两个约束,距顶部100像素,垂直居中。ViewController是textfield的代理,编辑更改事件被发送到textFieldAction: - (IB

给定一个textfield,我希望它在用户键入文本时动态调整水平大小。我还希望它在superview中保持居中。我偶然发现了一种方法,但它似乎是人为的,不太可能是正确的方法。我觉得这里缺少了一些简单的东西,比如文本字段的属性、控件或一些我不熟悉的协议

在Interface Builder中,我有一个UITextField,文本为“\”。它有两个约束,距顶部100像素,垂直居中。ViewController是textfield的代理,编辑更改事件被发送到textFieldAction:

- (IBAction)textFieldAction:(UITextField *)sender {
    NSString *s = sender.text;
    CGSize newSize = [sender sizeThatFits:CGSizeMake(MAXFLOAT, MAXFLOAT)];
    CGRect newFrame = sender.frame;
    newFrame.size = newSize;
    sender.frame = newFrame;
    sender.text = s;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    textField.text = @"";
    return YES;
}
奇怪的是

  • 如果未在文本字段中将文本设置为@“”,则应开始编辑:文本字段不会动态调整大小

  • 如果我没有在textFieldAction:中重新分配文本,则textfield会动态调整大小,但不会动态保持居中

在这两种情况下,当textfield辞去第一响应者的职务时,最终会调整布局


这是获得动态调整大小和居中文本字段的正确方法,还是黑客攻击?

对我来说,这似乎是黑客攻击,但我现在无法测试我自己的建议。 如果我试图在用户输入期间使文本字段居中,我会使用

-(BOOL)textField:(UITextField)shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
在UITextFieldDelegate协议中,并在那里进行计算。 在进行计算时,您还可以尝试
[textfield sizeToFit]
来完全消除计算

您也可以摆脱这些限制,只需设置
textfield.center.x=[[UIScreen mainScreen]screensize].width/2
textfield.center.x=textfield.superview.center.x
,使其水平居中。或者你坚持使用autolayout,我只是没有那么喜欢它

从文本字段的文档中:shouldChangeCharactersRange:replacementString:

Return Value:  
YES if the specified text range should be replaced; otherwise, NO to keep the old text.

Discussion:  
The text field calls this method whenever the user types a new character in the text field or deletes an existing character.`

因此,请务必返回YES,如果您尝试,请告诉我结果如何。

谢谢,我刚刚尝试了您的建议,但使用textField:ShouldChangeCharactersRange:replacementString:的效果与使用操作几乎相同。如果文本字段中的文本字符串未设置为@“”,则应开始编辑并在文本字段中重新分配:ShouldChangeCharactersRange:replacementString:文本字段不会动态调整大小。顺便说一下,我尝试了您的建议,用sizeToFit替换帧大小调整计算,这是一种改进。谢谢。您能设置一些断点或日志并确定调用这些方法的顺序吗?最具体地说,当您点击textfield时,textViewAction:是调用一次还是两次?如果两次,谁是发送者?textFieldAction:为每次按键调用一次。发件人是文本字段。textFieldShouldBeginEditing:在我点击textField时调用,textFieldAction:在每次点击时调用一次,textFieldShouldReturn:在我点击“return”时调用。经过多次实验后,似乎textFieldShouldBeginEditing:只需要一行:
sender.text=sender.text该字符串重新分配是必要的,但已足够。黑客看起来很有吸引力。