键入时自动拉伸UITextField

时间:2016-05-09 11:04:15

标签: ios swift autolayout uitextfield uilabel

我有一个以编程方式创建的UITextField。我想在开头和结尾都有不可编辑的前缀字符,例如

"Hello [TextField] world". 

首先,我尝试手动添加字符并使用shouldChangeCharactersInRange make,但这种方法不起作用,因为如果用户长按TextField并开始,他可以编辑第一个字符(所以可以弄乱带有前缀的字符)。这个选项似乎不太方便。

另一种选择可能是创建一个空的UITextField和2个静态UILabels(用于“Hello”和“world”)。这里出现了另一个问题。当我的UITextField文本居中对齐(并在视图中垂直居中)时,我给它一个宽度的视图,0为x轴(所以textField触及视图的左右两边) 。相反,如果我在创建时尝试为TextField赋予固定宽度,则宽度不会随着用户键入而扩展/拉伸。

我想要实现的是从0开始TextField的宽度,并在UILabel的每一侧都有静态"hello "[textField]" world";当用户键入时,将textField的宽度增加/拉伸到左侧和右侧(因为它是文本对齐的中心)。当textField的宽度延伸时,将UILabel推向边缘。所以:

|          ["Hello "][textField][" world"]         |

|    ["Hello "][MyTextFieldTextIsNice][" world"]   |

在不使用Storyboard并以编程方式实例化UITextFieldUILabel的情况下实现它的正确方法是什么?如何创建自动调整大小的textField作为用户类型,推动两侧的UILabel?

4 个答案:

答案 0 :(得分:3)

我使用这种情况,使用StoryboardUITextField的两边都使用UILabel与中心对齐。

以下是storyboard的屏幕截图。

enter image description here

然后我正在代理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 Code

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
    }

这可能会有所帮助。

You can download the sample code from here - Objective c

You can download the sample code from here - Swift

<强>输出

enter image description here

答案 1 :(得分:1)

这可以做,但需要做一些工作。您需要处理UITextFieldDelegate并使用宽度约束。您可以按照大纲来实现它。

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

    (BOOL)textField:(UITextField *)textFieldshouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

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

  3. 如果您也为这两侧的其他标签设置约束,它应该按预期运行。 @"[Label][UITextField][Label]"

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

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

    -(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;
     }
    

答案 2 :(得分:1)

我不相信您可以在不可编辑的文本字段中添加文本,但您可以做的是自动检查输入的文本并添加“Hello”并附加“world”。

您首先必须检查输入的文字。你可以这样做:

var charArray: [Character] = []

for character in textField.characters {
charArray.append(character) }

这将为您提供一系列字符。然后,您可以检查第一个字符是否仍为“Hello”,以及最后一个字符是否仍为“world”:

func checkInputStartsHello() -> Bool {

guard charArray[0] == "H" else { return false }
guard charArray[1] == "e" else { return false }
guard charArray[2] == "l" else { return false }
guard charArray[3] == "l" else { return false }
guard charArray[4] == "o" else { return false }
guard charArray[5] == " " else { return false }

return true
}

func checkInputEndsWorld() -> Bool {

guard charArray[charArray.count - 1] == "d" else { return false }
guard charArray[charArray.count - 2] == "l" else { return false }
guard charArray[charArray.count - 3] == "r" else { return false }
guard charArray[charArray.count - 4] == "o" else { return false }
guard charArray[charArray.count - 5] == "w" else { return false }
guard charArray[charArray.count - 6] == " " else { return false }

return true
}

如果这些是假的,则添加“Hello”和“world”:

if !checkInputStartsHello() { textField.text = "Hello " + textField.text }
if !checkInputEndsWorld() { textField.text = textField.text + " world" }

确保每次输入文本时都更新charArray并重新检查textField.text。

此代码的结果将是一个文本字段,可在用户点击键盘上的“完成”后自动显示您提供的开头和结尾。

答案 3 :(得分:1)

您应该使用文本字段的leftviewrighttview。例如,

 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;

同样你可以为右视图做。

根据需要的框架创建标签和填充视图,然后将该标签添加到填充视图,并将该填充视图设置为文本字段的leftviewrightview

因此,它会随着文本字段的变化自动更改其位置和大小。

希望这会有所帮助:)