我有一个带有自定义字体的UITextField,一切正常,直到Swift更新到1.2和2.0。之后,每次我尝试编辑文本字段时,它都会将其字体更改为另一个看起来像Times New Roman的字体。有没有人有这方面的经验?
答案 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时,我有一个奇怪的字体更改其大小和字体类型的情况。 必须使用以下代码行显式管理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)
}
答案 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
,如下所示:
然后,在代码中,您需要管理可见性的切换,每次都设置属性文本,以确保其格式正确。我还在场上辞职第一个响应者(),以便处理一些我仍然无法解决的定位故障。
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
}