web-dev-qa-db-ja.com

UITextFieldの文字間隔を設定する方法

ユーザーが4桁のPINコードを入力する必要があるアプリがあります。すべての数字は、互いに一定の距離にある必要があります。

PinTextFieldUIViewのサブクラスである場合、これを行う方法はありますか? ViewControllerUITextFieldTextDidChangeNotificationを使用し、変更ごとに属性付きテキストを設定できることを知っています。ただし、通知はUIViewでは機能しないようです。

また、UITextFieldテキストの文字間隔を設定する場合、更新ごとに属性付きの文字列を作成するよりも簡単な方法がないのではないかと思いましたか?

正しい間隔:

TextField with correct spacing

間違った間隔:

TextField with wrong spacing

35
KMV

これが最終的にすべての変更に対してカーニングを設定するために働いたものです

    textField.addTarget(self, action: "textFieldDidChange", forControlEvents: .EditingChanged)

    func textFieldDidChange () {    
        let attributedString = NSMutableAttributedString(string: textField.text)
        attributedString.addAttribute(NSKernAttributeName, value: 5, range: NSMakeRange(0, count(textField.text)))
        attributedString.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, count(textField.text)))
        attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blackColor(), range: NSMakeRange(0, count(textField.text)))

        textField.attributedText = attributedString
    }

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

        if count(textField.text) < 4 {
            return true
            // Else if 4 and delete is allowed
        }else if count(string) == 0 {
            return true
            // Else limit reached
        }else{
            return false
        }
    }

ただし、数値は幅が異なるため問題が残ります。数字ごとにUITextFieldを作成することに頼ります。

9
KMV

attributedTextに行く必要はありません。これは正直なところ、変更された間隔で実装する混乱でした。キーボードを閉じるとすぐに間隔が消えたので、さらに掘り下げました。

すべてのUITextFieldにはdefaultTextAttributesというプロパティがあり、Apple "に従って辞書を返しますデフォルト値を持つテキスト属性の。」Appleドキュメント は、「このプロパティは、指定された属性をテキストフィールドのテキスト全体に適用する」とも言います。

コード内の適切な場所、通常はテキストフィールドが初期化されている場所を見つけて、次をコピーして貼り付けてください。

Swift 3.0

textfield.defaultTextAttributes.updateValue(spacing, forKey: NSKernAttributeName)

ここで、間隔はCGFloatタイプです。例2.0

これは異なるフォントでも機能します。

乾杯!!


最新の構文は次のようです:

 yourField.defaultTextAttributes.updateValue(36.0, 
     forKey: NSAttributedString.Key.kern)
31
iOSer

defaultTextAttributesUITextFieldプロパティを使用します。 NSAttributedStringへの変換を処理し、設定した属性を適用します。例えば:

    NSMutableDictionary *attrs = [self.textField.defaultTextAttributes mutableCopy];
[attrs addEntriesFromDictionary:@{
    NSKernAttributeName: @18,
    NSUnderlineColorAttributeName: [UIColor grayColor],
    NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle | NSUnderlinePatternDash)
}];
self.textField.defaultTextAttributes = attrs;
3
Avi

デリゲートをtextfield.Hopeに設定した後、このコードを試してください。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:textField.text];
    [attributedString addAttribute:NSKernAttributeName
                             value:@(5.4)
                             range:NSMakeRange(0, textField.text.length)];
    textField.attributedText = attributedString;
    return YES;
}
0
Vishnuvardhan

属性付きの文字列を使用する代わりに、他のソリューションについては本当に確信が持てません。

ただし、通知部分については、textFieldsデリゲートをUIViewに設定し、ビューで以下のメソッドを定義できます。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 

上記のメソッドは、テキストフィールドに入力されたテキストが変更されるたびに呼び出されます。

0
Scarlet

これはSwift 2.2で正常に機能しています。これがテキストフィールドの文字間隔に役立つことを願っています

override func viewDidLoad() {
 // Do any additional setup after loading the view.
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(SignupVC.limitTextField(_:)), name: "UITextFieldTextDidChangeNotification", object: txtContactNumber)
}
 func limitTextField(Notif:NSNotification) {

    let limit=10;

    let attributedString = NSMutableAttributedString(string: txtContactNumber.text!)
    attributedString.addAttribute(NSKernAttributeName, value: 7, range: NSMakeRange(0, (txtContactNumber.text?.characters.count)!))
   // attributedString.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, count(textField.text)))
    attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blackColor(), range: NSMakeRange(0,(txtContactNumber.text?.characters.count)!))

    txtContactNumber.attributedText = attributedString
    if(txtContactNumber.text?.characters.count>limit)
    {
        txtContactNumber.text=txtContactNumber.text?.substringToIndex(limit)
    }
}
0
Arvind Kumar