ユーザーが4桁のPINコードを入力する必要があるアプリがあります。すべての数字は、互いに一定の距離にある必要があります。
PinTextField
がUIView
のサブクラスである場合、これを行う方法はありますか? ViewController
でUITextFieldTextDidChangeNotification
を使用し、変更ごとに属性付きテキストを設定できることを知っています。ただし、通知はUIView
では機能しないようです。
また、UITextField
テキストの文字間隔を設定する場合、更新ごとに属性付きの文字列を作成するよりも簡単な方法がないのではないかと思いましたか?
正しい間隔:
間違った間隔:
これが最終的にすべての変更に対してカーニングを設定するために働いたものです
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
を作成することに頼ります。
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)
defaultTextAttributes
のUITextField
プロパティを使用します。 NSAttributedString
への変換を処理し、設定した属性を適用します。例えば:
NSMutableDictionary *attrs = [self.textField.defaultTextAttributes mutableCopy];
[attrs addEntriesFromDictionary:@{
NSKernAttributeName: @18,
NSUnderlineColorAttributeName: [UIColor grayColor],
NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle | NSUnderlinePatternDash)
}];
self.textField.defaultTextAttributes = attrs;
デリゲートを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;
}
属性付きの文字列を使用する代わりに、他のソリューションについては本当に確信が持てません。
ただし、通知部分については、textFields
デリゲートをUIView
に設定し、ビューで以下のメソッドを定義できます。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
上記のメソッドは、テキストフィールドに入力されたテキストが変更されるたびに呼び出されます。
これは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)
}
}