UITextField не прокручивается до конца после реализации textRectForBounds и редактированияRectForBounds в подклассе?
У меня есть подкласс UITextField, где я реализую следующие методы:
- (CGRect)textRectForBounds:(CGRect)bounds {
return CGRectInset(bounds , 30, 7);
}
-(CGRect) editingRectForBounds:(CGRect)bounds {
return CGRectInset(bounds , 30, 7);
}
Из-за этих двух методов UITextField
не прокручивается до конца, когда введенный текст больше ширины UITextField
. Есть ли какое-либо решение для этого?
Ответы
Ответ 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) не будет вызываться