UITextField上的setDefaultTextAttributes不起作用

时间:2014-03-11 10:29:37

标签: ios objective-c

我在向空的UITextField分配文本属性(字体,颜色,字距调整)时遇到问题。以下是一些示例代码:

// testinput is an UITextField created in storyboard
//
 [testinput setDefaultTextAttributes: @{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue-Light" size:20.0], NSForegroundColorAttributeName: [UIColor redColor]}  ];

理论上应该改变字体&颜色,但没有任何反应。我也尝试了不同的创建字典的方法,没有变化。请不要建议使用属性字符串,UITextField最初必须为空。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:4)

阅读Gregs评论后找到解决方案。 要在空UITextField中设置初始属性,请使用

@property(nonatomic, copy) NSDictionary *typingAttributes

属性。它必须在UITextField的一个委托方法中设置:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{
   NSDictionary* d = textField.typingAttributes;
   NSMutableDictionary* md = [NSMutableDictionary dictionaryWithDictionary:d];

   md[NSFontAttributeName] = [UIFont systemFontOfSize:30];
   md[NSKernAttributeName] = @(9.5f);

   textField.typingAttributes = md;
   return YES;
}

答案 1 :(得分:0)

如果使用setDefaultTextAttributes,则更改将应用​​于UITextField的textAttribute而不是text属性。因此,如果您想使用text属性,并且我认为您希望使用它,请尝试:

testinput.fort = [UIFont fontWithName:@"HelveticaNeue-Light" size:20.0];
testinput.textColor = [UIColor redColor]

//扩展

我担心你不能以你想要的方式使用它。 这来自Apple文档:

By default, this property returns a dictionary of text attributes with default values.
Setting this property applies the specified attributes to the entire text of the text field. Unset attributes maintain their default values.

看起来当你使用defaultTextAttributes属性时,你只会获得一个字典,如果你想设置它,你必须创建属性字符串(字典):

答案 2 :(得分:0)

Swift 4版本

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let currentAttributes = textField.typingAttributes
    if var attributes = currentAttributes {
        attributes[NSAttributedStringKey.foregroundColor.rawValue] = UIColor.white
        attributes[NSAttributedStringKey.font.rawValue] = UIFont.systemFont(ofSize: 26)
        textField.typingAttributes = attributes
    }

    return true
}