Ios 键入时自动拉伸UITextField
我有一个通过编程创建的Ios 键入时自动拉伸UITextField,ios,swift,autolayout,uitextfield,uilabel,Ios,Swift,Autolayout,Uitextfield,Uilabel,我有一个通过编程创建的UITextField。我希望在开头和结尾有不可编辑的前缀字符,例如 "Hello [TextField] world". 首先,我尝试手动添加字符,并使用shouldChangeCharactersInRangemake添加字符,但这种方法不起作用,因为如果用户长按文本字段并开始,他可以编辑第一个字符(这样会弄乱前缀字符)。这个选项似乎不太方便 另一个选项是创建一个空的UITextField,以及两个静态的UILabels(用于“Hello”和“world”)。在这
UITextField
。我希望在开头和结尾有不可编辑的前缀字符,例如
"Hello [TextField] world".
首先,我尝试手动添加字符,并使用shouldChangeCharactersInRange
make添加字符,但这种方法不起作用,因为如果用户长按文本字段并开始,他可以编辑第一个字符(这样会弄乱前缀字符)。这个选项似乎不太方便
另一个选项是创建一个空的
UITextField
,以及两个静态的UILabels
(用于“Hello”和“world”)。在这方面,出现了另一个问题。由于我的UITextField
的文本是居中对齐的(并且在视图中垂直居中),我给它一个视图的宽度,给它一个x轴0(因此textField同时接触视图的左边缘和右边缘)。相反,如果我在创建时尝试给文本字段一个固定的宽度,则该宽度不会随着用户输入而扩展/拉伸
我想要实现的是从0开始文本字段的宽度,并在每一面都有静态的UILabel
s,比如“hello”[TextField]“world”
;当用户输入时,将文本字段的宽度向左和向右增加/拉伸(作为文本对齐的中心)。当文本字段的宽度拉伸时,将UILabel
推向边缘。。因此:
| ["Hello "][textField][" world"] |
| ["Hello "][MyTextFieldTextIsNice][" world"] |
在不使用脚本和编程实例化
UITextField
和UILabel
s的情况下,实现它的正确方法是什么?如何创建自动调整大小的文本字段作为用户类型,将UILabel推到两侧?这可以完成,但需要做一些工作。您需要处理UITextFieldDelegate
,并使用宽度约束。你可以按照大纲来完成它
UITextField
中输入的字符串长度:
(BOOL)textField:(UITextField*)textField应更改字符范围:(NSRange)范围替换字符串:(NSString*)字符串UITextField
上的宽度约束-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
// This is the string the user entered. Get the string and use string metrics
// to figure out how long the string will be based on font and
// font size and adjust the width constraint on the UITextField
// accordingly.
return YES;
}
我不相信您可以向文本字段添加不可编辑的文本,但您可以做的是自动检查输入的文本,并在“Hello”前加上“world” 您首先必须检查输入的文本。你可以这样做:
var charArray: [Character] = []
for character in textField.characters {
charArray.append(character) }
这将为您提供一个字符数组。然后,您可以检查第一个字符是否仍然是“Hello”,最后一个字符是否仍然是“world”:
如果这些为假,则添加“Hello”和“world”:
if !checkInputStartsHello() { textField.text = "Hello " + textField.text }
if !checkInputEndsWorld() { textField.text = textField.text + " world" }
确保每次输入文本时都更新字符集,并重新检查textField.text
此代码的结果将是一个文本字段,在用户单击键盘上的“完成”后,它会自动显示您给它的开头和结尾。您应该使用文本字段的
左视图和右视图。比如说,
UIView *paddingView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 10, 40)];
// create one label and add it to padding view and then set that padding as left view
datePickerField.leftView = paddingView; //here datepicker field is my textfield
datePickerField.leftViewMode = UITextFieldViewModeAlways;
同样,您也可以为rightview执行此操作
根据所需的框架创建标签和填充视图,然后将该标签添加到填充视图,并将该填充视图设置为文本字段的leftview
或rightview
因此,它会随着文本字段的变化自动改变它们的位置和大小
希望这会有所帮助:)我使用这种情况,使用情节提要和UITextField
的两侧使用UILabel
与中心对齐
下面是情节提要
的屏幕截图
然后我做了UITextField
的委托,并使用以下代码
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *strForWholeString = [NSString stringWithFormat:@"%@%@",textField.text,string];
CGSize fontSize = [strForWholeString sizeWithAttributes:
@{NSFontAttributeName:
[UIFont fontWithName:@"Helvetica" size:14]}];
if (self.textfieldLayoutWidthConstraint.constant >= 40) {
self.textfieldLayoutWidthConstraint.constant = fontSize.width + 40 ;
[self.view layoutIfNeeded];
[self.view setNeedsUpdateConstraints];
}
return YES;
}
Swift代码
func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
let strForWholeString = NSString(format:"%@%@", textField.text!,string) as String
let fontSize: CGSize = strForWholeString.sizeWithAttributes([NSFontAttributeName: UIFont.systemFontOfSize(14.0)])
if self.textfieldLayoutWidthConstraint?.constant >= 40 {
self.textfieldLayoutWidthConstraint!.constant = fontSize.width + 40 ;
self.view.layoutIfNeeded();
self.view.setNeedsUpdateConstraints();
}
return true
}
希望这能帮上大忙
输出
谢谢@Cliff。我认为这比乔纳斯的答案更好,但是我对你的第2点和第3点有点困惑。你能做一个虚拟的例子来展示你的方式吗?我将非常感激……是的,这样做更好,这是正确的方法。我不打算为您编写程序,但我会稍微扩展一下。如果您也扩展一下,我将不胜感激。当然,这会给我一个火花,让我明白,有没有一种方法可以做到这一点,而不受宽度限制?@Irfan你需要检查像wiseJonas
answer这样的角色。
func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
let strForWholeString = NSString(format:"%@%@", textField.text!,string) as String
let fontSize: CGSize = strForWholeString.sizeWithAttributes([NSFontAttributeName: UIFont.systemFontOfSize(14.0)])
if self.textfieldLayoutWidthConstraint?.constant >= 40 {
self.textfieldLayoutWidthConstraint!.constant = fontSize.width + 40 ;
self.view.layoutIfNeeded();
self.view.setNeedsUpdateConstraints();
}
return true
}