Текст в UITextField перемещается вверх после редактирования (центр при редактировании) - PullRequest
45 голосов
/ 13 марта 2012

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

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

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

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

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

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

This is the problem.

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

Вот часть моего кода, связанного с amountField.

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 альфа, это нормально.

Ответы [ 12 ]

51 голосов
/ 07 октября 2015

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

 - (void)textFieldDidEndEditing:(UITextField *)textField
 {
    [textField layoutIfNeeded]; //Fixes iOS 9 text bounce glitch
    //...other stuff
}
23 голосов
/ 14 марта 2012

Итак ...

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

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

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

8 голосов
/ 22 ноября 2016

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

3 голосов
/ 25 апреля 2015

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

2 голосов
/ 24 сентября 2014

Я борюсь с этой проблемой почти каждый раз, когда дизайн приложения выполнен с использованием собственного шрифта.Одним из вариантов является исправление шрифта (но это слишком много работы - по крайней мере, для меня :)).Второй вариант, который я использую, это создание подкласса UITextField и переопределение editRectForBounds: и 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, поэтому будьте осторожны при их использовании:)

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

1 голос
/ 18 мая 2016

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

0 голосов
/ 18 августа 2017

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

- (void) setText:(NSString *)text {
    [super setText:text];
    [self layoutIfNeeded];
}
0 голосов
/ 06 июня 2016

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

-(IBAction)txtFieldDidEndEditing:(UITextField *)sender {
     NSDictionary *style = @{
                            NSBaselineOffsetAttributeName: @(0)
                            };
    self.txtField.attributedText = [[NSAttributedString alloc] initWithString:self.txtField.text attributes:style];
}
0 голосов
/ 02 февраля 2016

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

0 голосов
/ 23 декабря 2014

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

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

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

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

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

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

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

Swift версия

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, могут различаться для каждого шрифта и размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...