Подтвердить что ты не робот

UITextField не прокручивается до конца после реализации textRectForBounds и редактированияRectForBounds в подклассе?

У меня есть подкласс UITextField, где я реализую следующие методы:

- (CGRect)textRectForBounds:(CGRect)bounds {

  return CGRectInset(bounds , 30, 7);
}

-(CGRect) editingRectForBounds:(CGRect)bounds {
  return CGRectInset(bounds , 30, 7);
}

Из-за этих двух методов UITextField не прокручивается до конца, когда введенный текст больше ширины UITextField. Есть ли какое-либо решение для этого?

4b9b3361

Ответ 1

Не работает только из-за размера шрифта текста, который вы указали в UITextField и CGRectInset, который вы применяете. На самом деле это должно соответствовать размеру шрифта, который вы устанавливаете. Например, для размера шрифта 14.0 просто измените свой метод, как показано ниже:

- (CGRect)textRectForBounds:(CGRect)bounds {
    return CGRectInset(bounds , 30, 6);
}
-(CGRect) editingRectForBounds:(CGRect)bounds {
    return CGRectInset(bounds , 30, 6);
}

Причина в том, что прямоугольник рисования текста. Например, когда мы устанавливаем размер шрифта UITextField как 14.0, то для настройки текста в кадре требуется как минимум высота 18,0. Таким образом, для текста требуется дополнительно 4 пикселя, вы можете сказать, что это оверлейный кадр. В связи с этим в вашем случае это условие не удовлетворяет, поскольку, насколько я предполагаю, вы скорректировали размер шрифта до 14.0, а по умолчанию высота кадра UITextField равна 30,0, а ваше маскирование края составляет 7,0 с каждой стороны, что означает всего 14,0. Таким образом, ваш прямоугольник для текста возвращает 16.0, который, в свою очередь, блокирует обновление ОС текстового фрейма, поскольку он находится вне графического контекста. Надеюсь, вы поняли. Если он разрешит вашу проблему, пожалуйста, примите мой ответ. Более хороший ответ будет следующим:

- (CGRect)textRectForBounds:(CGRect)bounds {
return CGRectInset(bounds , 30, (30 - self.font.pointSize - 4)/2);
}

-(CGRect) editingRectForBounds:(CGRect)bounds {
    return CGRectInset(bounds , 30, (30 - self.font.pointSize - 4)/2);
}

Наслаждайтесь!

Ответ 2

Это, вероятно, конфликт между вашей пользовательской высотой UITextField CALayer с вставками и размером шрифта.

Вы можете попробовать один из этих настроек:

  • Уменьшить размер шрифта;
  • Увеличьте высоту UITextField на Storyboard или программно в вашем подклассе, например:

    - (void)drawRect:(CGRect)rect {
        CGRect frameRect = self.frame;
        frameRect.size.height = 35 //specify the height you want;
        self.frame = frameRect;
     }
    
  • Уменьшите значение y-координаты на CGRectInset;

  • Или используйте UIEdgeInsets, чтобы иметь больше контроля при настройке значений каждой позиции. Что-то вроде:

    - (CGRect)textRectForBounds:(CGRect)bounds{
        UIEdgeInsets contentInsets = UIEdgeInsetsMake(5, 30, 5, 30);
        return UIEdgeInsetsInsetRect(bounds, contentInsets);
    }
    
    - (CGRect)editingRectForBounds:(CGRect)bounds{
        UIEdgeInsets contentInsets = UIEdgeInsetsMake(5, 30, 5, 30);
        return UIEdgeInsetsInsetRect(bounds, contentInsets);
    }
    

Ответ 3

Причина. Вы используете фиксированный размер шрифта для текста текстового поля. Используйте это

 textFieldObject.adjustsFontSizeToFitWidth = YES;  

Короче и просто. Если вы хотите установить минимальный размер шрифта, вы можете использовать этот

 textFieldObject.minimumFontSize

Enjoy

Ответ 4

Я не уверен, что это то, что вы ищете, но изменяя editingRectForBounds следующим образом, сделайте динамику вставки так, чтобы текстовое поле получилось "полным", оно уменьшит вставку, чтобы текст заполнил все текстовое поле.

Предполагая, что textInset_ - желаемая вставка:

- (CGRect)editingRectForBounds:(CGRect)bounds {
    CGFloat compensate = .0f;
    CGSize size = [self.text sizeWithFont:self.font];
    CGFloat textboxWidth = CGRectGetWidth(self.width);

    // If size of text plus inset (right side) is bigger
    // than textbox width, don't set an inset
    if (size.width+textInset_ >= textboxWidth) {
        compensate = 0;
    }

    // If text area (textbox width minus two insets) is less than
    // text size, lessen the inset so the text fits in 
    else if (textboxWidth - textInset_*2 < size.width) {
        compensate = fabs(size.width - (textboxWidth - textInset_));
    }

    // Text fits in textbox WITH insets
    else {
        compensate = textInset_;
    }
    return CGRectInset(bounds, compensate, 10);
}

Ответ 5

step 1 - make a custom text field MyTextField first

@interface MyTextField : UITextField
step 2 - override MyTextField methods as per your requirement

///place holder position

- (CGRect)placeholderRectForBounds:(CGRect)bounds
 {
   return CGRectInset(bounds, 8, 8);
 }
 // text position
 - (CGRect)textRectForBounds:(CGRect)bounds {

  return CGRectInset(bounds, 8,4);
 }

 // text position while editing
 - (CGRect)editingRectForBounds:(CGRect)bounds {

     return CGRectInset(bounds, 8, 4);
 }
step 3- import MyTextField in your controller class & make object of MyTextField

#import "MyTextField.h"

-(void) viewWillAppear:(BOOL)animated {

    MyTextField* textfield1 = [[MyTextField alloc] init];
    // and so on

}

С ссылкой на эту ссылку:

- (CGRect) textRectForBounds: (CGRect) не будет вызываться