it-swarm.com.ru

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

У меня странная проблема. У меня есть 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 альфа, это нормально.

45
Dominik Hadl

Так...

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

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

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

23
Dominik Hadl

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

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

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

8
Alexis Candelaria

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

3
skr1p7k1dd

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

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

2
JakubKnejzlik

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

1
Christopher Garcia

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

0
King-Wizard

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

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

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

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

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

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

0
Gilbertat

Это потому, что 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
kdvijay

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

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

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

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

0
Zak Arntson