Увеличьте UITextField до определенной длины

У меня есть UITextField, который я хотел бы «автоматически» настроить размер его границ, чтобы освободить место для строки, добавленной в поле. Тем не менее, я хотел бы, чтобы он был максимальным с точки зрения ширины на определенную величину. Каков наилучший способ сделать это?

Спасибо за любую помощь.

ИЗМЕНИТЬ:

TestingView.h

#import <UIKit/UIKit.h>


@interface TestingView : UIView <UITextFieldDelegate> {

}

@end

TestingView.m

#import "TestingView.h"


@implementation TestingView

- (void)awakeFromNib
{
    CGRect testingBounds = self.bounds;

    testingBounds.size.width = testingBounds.size.width - 20;

    testingBounds.size.height = 30;

    CGPoint testingCenter = self.center;

    testingCenter.y = testingCenter.y - 75;

    UITextField *testingField = [[UITextField alloc] initWithFrame:testingBounds];

    testingField.center = testingCenter;

    testingField.delegate = self;

    testingField.placeholder = @"Testing";

    [self addSubview:testingField];
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    int yourMaxWidth = 150;

    float width = [textField.text sizeWithFont:
                   [UIFont systemFontOfSize: 14]  
                                 constrainedToSize:
                   CGSizeMake(yourMaxWidth, textField.bounds.size.height)].width;

    textField.bounds = CGRectMake(textField.bounds.origin.x,
                                      textField.bounds.origin.y,
                                      width, 
                                      textField.bounds.size.height);

    return YES;
}
@end

person PF1    schedule 29.11.2009    source источник
comment
Вы пытались изменить его размер и добавить гибкое пространство вокруг текстового поля?   -  person Jacob Relkin    schedule 30.11.2009


Ответы (2)


В методе делегата textField:shouldChangeCharactersInRange:replacementString: размер текста UITextField следует измерять с помощью sizeWithFont:constrainedToSize: и используйте возвращаемый параметр ширины CGSize чтобы установить ширину границ UITextField.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    float width = [yourTextField.text sizeWithFont:
           [UIFont systemFontOfSize: 14]  
                                      constrainedToSize:
           CGSizeMake(yourMaxWidth, yourTextField.bounds.size.height)].width;

    yourTextField.bounds = CGRectMake(yourTextField.bounds.origin.x,
                                      yourTextField.bounds.origin.y,
                                      width, 
                                      yourTextField.bounds.size.height);
}
person luvieere    schedule 30.11.2009
comment
Привет, luvieere: Спасибо за совет! К сожалению, кажется, что он расширяется с обеих сторон и случайно обрезает фрагменты текста с левой стороны. Есть ли способ решить эту проблему? - person PF1; 06.12.2009
comment
Попробуйте установить его рамку вместо его границ и вместо yourTextField.bounds.origin.x поставить фиксированное значение. Я проверю себя завтра, и если то, что я тебе сказал, не сработает, я попробую еще. - person luvieere; 06.12.2009
comment
luviere: Еще раз спасибо за ваш совет. Однако установка его на рамку и изменение его на заданное значение центральной точки, похоже, не очень помогает. У него все еще есть странная проблема перемещения/исчезновения, когда он становится слишком широким. - person PF1; 09.12.2009
comment
Ставить нужно не центральную точку, а левый край, и проблема слишком широкого решается ограничением его роста до определенного уровня: if (width <= K) yourTextField.bounds = CGRectMake(25, 50, width, yourTextField.bounds.size.height); //else do nothing - person luvieere; 09.12.2009
comment
luvieere: Возможно, это другой фрагмент кода, вызывающий проблемы, но проблема все равно остается. Кажется, что UITextField плавает в середине представления и исчезает, когда текст становится слишком длинным. - person PF1; 10.12.2009
comment
не могли бы вы опубликовать больше своего кода, чтобы было легче обнаружить ошибку? - person luvieere; 10.12.2009
comment
Я разместил код для примера UIView, который демонстрирует ошибку. Может ли возникнуть проблема, когда он получает информацию о границах из текущего текста без применения изменений пользователя? - person PF1; 23.12.2009
comment
Я решил проблему исчезновения, добавив lineBreakMode:UILineBreakModeHeadTruncation, но все еще есть проблема, когда она плавает в центре представления. Есть ли способ исправить это? - person PF1; 07.01.2010

Почему ты не можешь просто сказать:

if (yourTextField.frame.size.width > self.frame.size.width) {

      yourtextField.frame.size.width = yourtextField.frame.size.width;

}
person Jab    schedule 31.12.2009
comment
Привет, Джаба: Проблема с этим кодом заключается в том, что мне нужно, чтобы ширина текстового поля имела исходный размер, а затем автоматически увеличивалась эта ширина по мере ее роста. Таким образом, пользователь может редактировать текст только в том случае, если он щелкнет непосредственно по нему (а не по расширенному фрейму). - person PF1; 01.01.2010