UiTextField在Swift 1.2&amp ;;编辑时更改字体。 2.0

时间:2015-02-11 12:52:21

标签: ios uikit

我有一个带有自定义字体的UITextField,一切正常,直到Swift更新到1.2和2.0。之后,每次我尝试编辑文本字段时,它都会将其字体更改为另一个看起来像Times New Roman的字体。有没有人有这方面的经验?

6 个答案:

答案 0 :(得分:10)

我遇到了同样的问题并找到了解决方案。问题归结为setSecureTextEntry在设置字体时更改字体,而在未设置时不更改字体。实际上,只要您的UITextField有第一响应者,就永远无法更改字体。

诀窍是resignFirstResponder,然后再次致电setSecureTextEntry:然后becomeFirstResponder。此 工作(从iOS 9.2开始),但它会触发键盘显示/隐藏动画,并会导致屏幕“震动”#34;为了解决这个问题,你也需要杀死键盘动画。

这是我的完整解决方案:

- (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也有同样的问题。

答案 1 :(得分:7)

当使用按钮操作切换UiTextField的secureTextEntry时,我有一个奇怪的字体更改其大小和字体类型的情况。 enter image description here 必须使用以下代码行显式管理UiTextField的字体:

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

显示密码按钮中使用的完整代码:

//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

答案 2 :(得分: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()

答案 3 :(得分:0)

切换secureTextEntry标志后,使用自定义字体属性设置defaultTextAttributes

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

答案 4 :(得分: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;
   } 

答案 5 :(得分:0)

所有这些答案都非常有用,但考虑到我使用自定义字体,我必须使用不同的解决方案来实现我需要的结果。

您需要在故事板检查器窗格中为UITextField创建文本字段attributed,如下所示:

attributed selected in inspector

然后,在代码中,您需要管理可见性的切换,每次都设置属性文本,以确保其格式正确。我还在场上辞职第一个响应者(),以便处理一些我仍然无法解决的定位故障。

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

}