Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.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_Ios_Swift_Autolayout_Uitextfield_Uilabel - Fatal编程技术网

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
,并使用宽度约束。你可以按照大纲来完成它

  • 控制器应采用UITextFieldDelegate,并使用此方法检查用户在
    UITextField
    中输入的字符串长度:

    (BOOL)textField:(UITextField*)textField应更改字符范围:(NSRange)范围替换字符串:(NSString*)字符串

  • 根据字符串的长度动态调整
    UITextField
    上的宽度约束

  • 如果您也像这样为任意一侧的其他标签设置约束,则其行为应与您预期的一样<代码>@“[Label][UITextField][Label]”

  • 还可以在UITextField上设置约束,使其与其父视图的CenterX对齐

  • 检查输入的文本字段,如下所示:

    -(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你需要检查像wise
    Jonas
    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
        }