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

Текст в UITextField перемещается вверх после редактирования (во время редактирования)

У меня странная проблема. У меня есть UITextField, в котором пользователь должен написать количество чего-то, поэтому поле называется "amountField". Все выглядит отлично, когда пользователь начинает редактировать текстовое поле, текст находится в вертикальном и горизонтальном центре - это здорово.

Однако, когда пользователь заканчивает редактирование, текст немного поднимается. Я много пробовал, ничего не помогло...

Я добавляю скриншоты ниже, чтобы вы могли понять, в чем проблема.

Вот как это выглядит при редактировании поля - это нормально.

This is while editing the field - that's ok.

И вот как это выглядит при редактировании - это проблема !

This is the problem.

Пожалуйста, если кто-нибудь знает, что может вызвать это, я буду очень благодарен!:)

Вот некоторые из моего кода, связанные с количеством полей.

amountField.keyboardType = UIKeyboardTypeNumberPad;
amountField.returnKeyType = UIReturnKeyDone;
amountField.delegate = self;

[amountField setFont:[UIFont fontWithName:@"Nuptial Script LT Std" size:30]];   
amountField.borderStyle = UITextBorderStyleNone;
UIImage *amountBg = [UIImage imageNamed:@"skin2_ipad_amountField.png"];
[amountField setBackground:amountBg];

amountField.rightView = nil;
//amountField.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.2];

amountField.textAlignment = UITextAlignmentCenter;
amountField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
amountField.adjustsFontSizeToFitWidth = YES;
amountLabel.textColor = UIColorFromARGB(0x313030); //Using my own macro

amountField.frame = CGRectMake(300, 480, 136, 32);
amountField.center = CGPointMake(605, 439);

PS: Эти белые углы есть, потому что я устанавливаю фон в белый с 0,2 альфой, что хорошо.

4b9b3361

Ответ 1

Итак...

После многих часов попыток многого - я нашел проблему. В моем случае проблема заключается в шрифте. Я действительно не знаю, почему, но автор шрифта сделал шрифт странным (ведущий и т.д.), Он имеет пустое место внизу. Я не знаю почему, но когда вы редактируете текст, все свойства текста игнорируются, но после завершения редактирования они применяются.

Итак, если у вас есть аналогичная проблема, попробуйте изменить шрифт на Arial или что-то подобное.

Для получения полного объяснения обратитесь к следующим ссылкам: ссылка 1 и ссылка 2. Решение, рекомендуемое в этих ссылках, может избежать много головных болей и даже может быть применено для исправления проблемы, как текст, перемещающийся вверх, когда вы начинаете редактировать UITextField (используя системный шрифт или другие специальные шрифты).

Ответ 2

У меня была аналогичная проблема, которая начиналась с iOS 9. В основном у меня есть UITextField в ячейке просмотра коллекции. Иногда, когда пользователь заканчивает ввод и редактирование, текст "отскакивает" вверх, а затем снова возвращается в правильное положение. Очень странный и раздражающий сбой. Простое исправление этой проблемы было исправлено на iOS 9 и оказалось безопасным для iOS 7 и 8:

 - (void)textFieldDidEndEditing:(UITextField *)textField
 {
    [textField layoutIfNeeded]; //Fixes iOS 9 text bounce glitch
    //...other stuff
}

Ответ 3

Отключение ClipsToBounds для TextField разрешило это для меня.

Ответ 4

Я борюсь с этой проблемой почти каждый раз, когда дизайн приложения с пользовательским шрифтом. Один из вариантов - исправить шрифт (но это слишком много работы - по крайней мере для меня:)). Второй вариант, который я использую, заключается в подклассе UITextField и переопределении методов редактированияRectForBounds: и placeholderRectForBounds: и исправления смещения. Он также должен работать для вашего дела.

@implementation MyTextFieldWithFixedFontPosition

-(CGRect)editingRectForBounds:(CGRect)bounds{
    return CGRectOffset([self textRectForBounds:bounds], 0, 0.5); //0.5 is just example, you can adjust to any offset you like
}
-(CGRect)placeholderRectForBounds:(CGRect)bounds{
    return [self editingRectForBounds:bounds];
}

@end

Я не тестировал его с помощью leftView или rightView, поэтому будьте осторожны при их использовании:)

ПРИМЕЧАНИЕ. Этот подход "зависит от шрифта", значения, используемые для смещения, могут различаться для каждого шрифта и размера

Ответ 5

Эта ошибка произошла со мной, когда я установил текст и стал первым ответчиком в viewDidLoad или viewWillAppear. Когда я переместил код becomeFirstResponder в viewDidAppear, ошибка исчезла.

Ответ 6

У меня были аналогичные проблемы с UITextfield, встроенными в UITableViewCell. Где именно этот код находится в вашем проекте? Я верю, что после того, как вы закончили редактирование определенного текстового поля, он отправляет себя -setNeedsDisplay и впоследствии его вызывает drawRect:. Это может объяснить сдвиг в выравнивании. В моем конкретном сценарии мне пришлось использовать метод делегата таблицы -willDisplayCell... для установки выравнивания содержимого. Я должен был бы узнать больше о вашем дизайне, чтобы предложить предложение.

Одним из возможных решений было бы использовать методы делегата текстового поля для установки выравнивания контента.

-(void)textFieldDidEndEditing:(UITextField *)textField{
     if (amountField == textField){
          amountField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        }
}

Ответ 7

Мне не удалось изменить файл шрифта, поэтому, когда я решил это, я сохранил исходный кадр UITextField в свойстве и применил следующий код:

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    textField.frame = self.usernameFrame;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    textField.frame = CGRectOffset(self.usernameFrame, 0, 1);
}

Это немного взломанный, но он выполняет свою работу.

Ответ 8

В iOS 8.1 и ниже наблюдается сбой, я не знаю, будут ли они исправлять его позже, но в то время не существует уникального решения, которое фиксирует все случаи, потому что ошибка и решения - это тип шрифта, зависящий от размера.

Одно из этих решений или комбинация этих решений ниже может решить вашу проблему:

  • Изменение размера шрифта.

  • Изменение типа шрифта.

  • Изменение размера UITextField.

  • Декомпиляция рассматриваемого шрифта, изменение характеристик шрифта и его перекомпиляция (для получения дополнительных пояснений обратитесь к следующим ссылкам: ссылка 1 и ссылка 2).

В противном случае это другое самодостаточное решение ниже может решить вашу проблему:

Быстрая версия

import UIKit

class CustomTextField: UITextField {

    ...

    override func textRectForBounds(bounds: CGRect) -> CGRect {
        // Possible values.
        return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0))
    }

    override func editingRectForBounds(bounds: CGRect) -> CGRect {
        // Possible values.
        return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0))
    }

    override func placeholderRectForBounds(bounds: CGRect) -> CGRect {
        // Possible values.
        return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0))
    }

}

Это решение было протестировано с помощью leftView и работает как шарм.

ПРИМЕЧАНИЕ: этот подход "зависит от шрифта", значения, используемые для CGRectInset, могут различаться для каждого шрифта и размера.

Ответ 9

Проверьте клавиатуру, чтобы изменить вид положения всплывающего окна, если есть строка кода self.view.layoutIfNeeded() Удалить его. Удачи!

Ответ 10

Я исправил это, добавив ограничения высоты в UITextFields.

Ответ 11

Это связано с тем, что BaselineOffset для текстового поля изменилось. В UITextFieldDidEndEditing создание атрибута с NSBaselineOffset: 0 и использование этого attributedText устранит проблему.

-(IBAction)txtFieldDidEndEditing:(UITextField *)sender {
     NSDictionary *style = @{
                            NSBaselineOffsetAttributeName: @(0)
                            };
    self.txtField.attributedText = [[NSAttributedString alloc] initWithString:self.txtField.text attributes:style];
}

Ответ 12

Это решение выше для меня не работает. Мое решение - это подкласс UITextField и переопределить setText:

- (void) setText:(NSString *)text {
    [super setText:text];
    [self layoutIfNeeded];
}