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

Размер пули в UITextField с secureTextEntry изменяет размер, поскольку фокус переключается при использовании пользовательского шрифта

У меня есть UITextField, который использует шрифт Museo Sans Rounded 300. Все нормально работает для обычных UITextFields, но когда вы устанавливаете secureTextEntry = YES, тогда это смущающее изменение изменяется на размер пуль, поскольку UITextField получает и теряет фокус (т.е. Становится и отказывается, будучи первым ответчиком).

Когда фокус UITextField имеет фокус, маркеры, похоже, используют пользовательский шрифт, но как только он теряет фокус, они меняются на то, что они намного больше (стандартного размера).

4b9b3361

Ответ 1

Итак, единственный способ борьбы с этим - использовать методы делегата textFieldDidBeginEditing и textFieldDidEndEditing, отслеживать, что было введено в текстовое поле, заменить его маской пули и отключить secureTextEntry. Поэтому, когда они покидают поле, они фактически видят правильное количество пуль, а не их защищенный текст. Его взломанный и грязный, но он сделает для меня, возможно, и для вас.

Ответ 2

Я нашел легкое решение, оно работает неплохо. В основном вы должны изменить шрифт на собственный шрифт, когда вы установите secureTextEntry на yes.

- (void)textFieldDidBeginEditing:(UITextField *)textField{

    if([textField.text isEqual:@"Password"]){
        textField.text = @"";
        textField.font = [UIFont fontWithName:@"Helvetica" size:14.5];
        textField.secureTextEntry = YES;
    }
}

- (void)textFieldDidEndEditing:(UITextField *)textField{

    if([textField.text isEqual:@""]){
        textField.text = @"Password";
        textField.secureTextEntry = NO;
        textField.font = [UIFont fontWithName:@"YourFont" size:14.5];
    }
}

Ответ 3

Другое обходное решение:

Хотя это ошибка iOS (и новая в iOS 7, я должен добавить), у меня есть другой способ обойти это, что можно было бы найти приемлемым. Функциональность все еще немного ухудшена, но не сильно.

В принципе, идея состоит в том, чтобы установить шрифт в семейство шрифтов по умолчанию/стиль всякий раз, когда в поле что-то введено; но когда ничего не введено, установите его на свой собственный шрифт. (Размер шрифта можно оставить в покое, так как это семейство/стиль, а не размер, который является ошибкой.) Ловушка для каждого изменения значения поля и установки шрифта соответственно в это время. Тогда слабый текст "подсказки", когда ничего не введен, имеет шрифт, который вы хотите (пользовательский); но когда что-либо вводится (независимо от того, редактируете вы или нет), будет использоваться значение по умолчанию (Helvetica). Поскольку пули - это пули, это должно выглядеть нормально.

Единственным недостатком является то, что символы, которые вы вводите перед заменой пулями, будут использовать шрифт по умолчанию (Helvetica). Это только на долю секунды за персонажа. Если это приемлемо, то это решение работает.

Ответ 4

Я просто результат теста выше, @Javier Peigneux ответ является наиболее кратким

#pragma mark -- UITextFieldDelegate

- (void)textFieldDidBeginEditing:(UCSSafeTF *)safeTF{

    safeTF.font = [UIFont fontWithName:@"Helvetica" size:14];
}

- (void)textFieldDidEndEditing:(UCSSafeTF *)safeTF{

    safeTF.font = [UIFont fontWithName:@"Helvetica" size:14];
}

теперь я пишу так, и результат в порядке. то причина, по которой вы видите изменение размера пули от малого до большого, очень ясна, просто потому, что Apple iOS 10 ниже "помогает" изменить размер пользовательского шрифта. надежда поможет вам.

Ответ 5

Просто создайте метод, который вызывается каждый раз, когда выбирается переключатель show/hide password. Внутри метода установите шрифт в нуль, затем установите шрифт в свой собственный шрифт и размер шрифта. Вы должны установить настраиваемый шрифт и размер в методе viewWillAppear. Внутри этого метода вы повторно установите его.

Таким образом вам не нужно отключать secureTextEntry (что может сделать ваше текстовое поле уязвимым), и вам не нужно использовать textFieldDidBeginEditing или textFieldDidEndEditing.

Пример кода:

//if the password is obscured and the toggle to show it has been turned on, display password.  Else, obscure it.
- (IBAction)togglePasswordVisibility:(id)sender {
    //  Xcode contains a bug where the font changes to default font if these two lines of code are not included.
    self.passwordInputTextField.font = nil;
    self.passwordInputTextField.font = [UIFont fontWithName:@"myCustomFontName" size:myDesiredFontSize];  //set this in viewWillAppear as well!

    if (self.passwordInputTextField.secureTextEntry == YES) {
        self.passwordInputTextField.secureTextEntry = NO;
        [self.showHideButton setTitle:@"HIDE" forState:UIControlStateNormal];
    } else {
        self.passwordInputTextField.secureTextEntry = YES;
        [self.showHideButton setTitle:@"SHOW" forState:UIControlStateNormal];
    }
}