2015-02-11 3 views
8

У меня есть UITextField с настраиваемым шрифтом, все работает нормально до Swift до 1.2 и 2.0. Впоследствии каждый раз, когда я пытаюсь редактировать текстовое поле, он меняет шрифт на другой, который кажется своего рода Times New Roman. У кого-нибудь есть опыт?UiTextField изменяет шрифт при редактировании в Swift 1.2 и 2.0

+1

Как виноват этот Свифт? Во всяком случае, это ошибка UIKit framework. Вы сообщили Apple? –

ответ

7

У меня был странный случай шрифтов, изменяющих его размер и тип шрифта, когда secureTextEntry для UiTextField был переключен с помощью действия кнопки. enter image description here Если бы явно управлять шрифт для UITextField, используя следующие строки кода:

password.font = UIFont(name: "systemFont", size: 14) 
password.font = UIFont.systemFontOfSize(14) 

Полный код, используемый в Show Password Button:

//Function associated with the button for show password option 
@IBAction func switchShowPasswordAction(sender: AnyObject) { 
     if showPassword{ 
      showPassword = false 
      password.secureTextEntry = !showPassword 

     }else{ 
      showPassword = true 
      password.secureTextEntry = !showPassword 
     } 

     //Changing font fix 
     password.font = UIFont(name: "systemFont", size: 14) 
     password.font = UIFont.systemFontOfSize(14) 
} 

сообщение применяющим это изменение: enter image description here

+0

На самом деле мне просто нужно 1 строка 'password.font = UIFont (name:" systemFont ", size: 14)'. Я предполагаю, что из-за отсутствия шрифта с именем * systemFont *, система вернется к системному шрифту по умолчанию. Кажется, довольно хаки. – Peacemoon

+0

Pacemoon, Да, это хакки, но у вас не было другого выбора/помощи. Я попытался сделать это в одной строке, но не смог точно повлиять на размер, поэтому добавлен в эту дополнительную строку. – Abhijeet

+0

Что делать, если нам нужно использовать собственный шрифт. – Leena

0

Установить defaultTextAttributes с настраиваемым атрибутом шрифта после переключения сек. ureTextEntry flag

NSDictionary * attrsDictionary = @ {NSFontAttributeName: // customfont};
_passwordtextfield.defaultTextAttributes = attrsDictionary;

0

Мне пришлось применить следующее решение с последним Xcode 7.1.1, которое действительно работало в моем случае. Я подозреваю, что эта проблема связана с каркасом.

- (IBAction)btnPasswordShowAction:(id)sender { 


     self.txtPassword.secureTextEntry = !self.txtPassword.secureTextEntry; 

     NSString *tmpString = self.txtPassword.text; 
     self.txtPassword.text = @" "; 
     self.txtPassword.text = tmpString; 

     [self.txtPassword setFont:nil]; 
     self.txtPassword.font = [UIFont fontWithName:@"OpenSans-Regular" size:16.0]; 
    } 

#pragma mark - Textfield Delegate Methods 

- (void)textFieldDidBeginEditing:(UITextField *)textField 
    { 
     [self.txtPassword setFont:nil]; 
     self.txtPassword.font = [UIFont fontWithName:@"OpenSans-Regular" size:16.0]; 
    } 


    - (BOOL)textFieldShouldEndEditing:(UITextField *)textField 
    { 
     [self.txtPassword setFont:nil]; 
     self.txtPassword.font = [UIFont fontWithName:@"OpenSans-Regular" size:16.0]; 
     return YES; 
    } 
1

Поскольку я использовал пользовательские шрифты, нам нужно сохранить исходный шрифт. Создать расширение для UITextField:

extension UITextField { 
    func enablePasswordModeWithShowHide() { 
     secureTextEntry = false 
     let showButton = UIButton(type: UIButtonType.System) 
     showButton.setTitle("HIDE", forState: .Normal) 
     showButton.titleLabel?.textAlignment = .Right 
     showButton.sizeToFit() 
     rightView = showButton 
     rightViewMode = .Always 
     showButton.addTarget(self, action: "handleShowHideTapped", forControlEvents: .TouchUpInside) 
     showButton.tintColor = UIColor.blackColor() 
    } 

    func handleShowHideTapped() { 
     secureTextEntry = !secureTextEntry 
     let font = self.font 
     self.font = nil 
     self.font = font 
     if let oldText = text { 
      text = ""; 
      text = oldText; 
     } 

     if let button = rightView as? UIButton { 
      button.setTitle(secureTextEntry ? "SHOW" : "HIDE", forState: .Normal) 
      button.sizeToFit() 
     } 
    } 
} 

Где она может быть реализована следующим образом:

passwordTextField.enablePasswordModeWithShowHide() 
10

Я наткнулся на этот же вопрос и выяснили решение. Проблема сводится к setSecureTextEntry, изменяя шрифт, когда он установлен, и не меняет его, когда он не установлен. Фактически, вы никогда не сможете изменить шрифт, если у вашего UITextField есть первый ответчик.

Код: resignFirstResponder Перед тем как позвонить по телефону setSecureTextEntry:, а затем becomeFirstResponder. Это будет работы (начиная с iOS 9.2), но это вызывает отображение анимации клавиатуры/скрыть анимацию и заставит экран «встряхнуть». Чтобы обойти это, вам также нужно убить клавиатурную анимацию.

Вот мое полное решение:

- (void)setSecureTextEntry:(BOOL)secureTextEntry { 

    __weak typeof(self) weakSelf = self; 
    [UIView performWithoutAnimation:^{ 

     BOOL resumeResponder = NO; 
     if([[weakSelf textEntryField] isFirstResponder]) { 
      resumeResponder = YES; 
      [[weakSelf textEntryField] resignFirstResponder]; 
     } 

     [[weakSelf textEntryField] setSecureTextEntry:secureTextEntry]; 

     if(resumeResponder) { 
      [[weakSelf textEntryField] becomeFirstResponder]; 
     } 
    }]; 
} 

PS: Это не ошибка Swift. Это ошибка UIKit. У меня была такая же проблема с Objective-C.

+0

Не тратьте время на другое решение. Это лучше! – Ramis

+0

Это решение, безусловно, самое лучшее !! –

+0

Это решение работает отлично. Благодаря! – DBoyer

0

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

Вам нужно сделать текстовое поле attributed в раскадровке панели инспектора для UITextField, следующим образом:

attributed selected in inspector

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

func toggleShowPass() { 
    self.showing = !showing 

    txtpassword.secureTextEntry = !showing 
    textFieldPassword.resignFirstResponder() 

    let string = textFieldPassword.text! 
    let attrString = NSMutableAttributedString(string: string) 

    textFieldPassword.addAttribute(NSFontAttributeName, value: UIFont(name: "AvenirNext-Regular", size: 16.0)!, range: NSMakeRange(0, string.characters.count)) 
    textFieldPassword.attributedText = attrString 

} 
Смежные вопросы