2015-08-07 15 views
24

Tôi có một ứng dụng mà trong đó người dùng phải nhập mã pin gồm 4 chữ số. Tất cả các chữ số phải ở khoảng cách được đặt cách nhau.Cách đặt khoảng cách chữ cái của UITextField

Có cách nào để thực hiện điều này nếu PinTextField là một phân lớp của UIView? Tôi biết trong một số ViewController bạn có thể sử dụng UITextFieldTextDidChangeNotification và đặt văn bản được phân bổ cho mỗi thay đổi. Tuy nhiên, các thông báo dường như không hoạt động trong một số UIView.

Ngoài ra tôi đã tự hỏi nếu không có một cách đơn giản hơn làm cho một chuỗi quy cho mỗi bản cập nhật nếu bạn muốn thiết lập khoảng cách chữ của một văn bản UITextField?

khoảng cách đúng:

TextField with correct spacing

sai khoảng cách:

TextField with wrong spacing

+0

để bắt đầu với *** bạn phải sử dụng một phông chữ ** monospace !!!!! – Fattie

+0

Đối với bất cứ ai googling ở đây, điều này đã thay đổi đáng kể kể từ khi câu hỏi cũ này. *** KHÔNG *** sử dụng văn bản được phân bổ. Giải pháp là chết dễ dàng - nhìn vào câu trả lời của @iOSer dưới đây. – Fattie

Trả lời

8

Đây là những gì cuối cùng làm việc để thiết lập kern cho mỗi thay đổi

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

tuy nhiên vấn đề này vẫn còn bởi vì các số khác nhau có độ rộng khác nhau, tôi sẽ chỉ nghỉ mát trở lại thực hiện một UITextField cho mỗi chữ số.

+0

Giải pháp thích hợp là sử dụng phông chữ đơn cách. – Jurasic

0

Không thực sự chắc chắn về bất kỳ giải pháp khác thay vì sử dụng chuỗi do.

Nhưng đối với phần thông báo, bạn có thể đặt số textFields ủy quyền thành UIView và xác định phương thức bên dưới trong chế độ xem.

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

Phương thức trên được gọi mỗi lần văn bản được nhập vào trường văn bản thay đổi.

0

Hãy thử mã này Sau khi đặt đại biểu vào trường văn bản.Hy vọng nó sẽ hoạt động.

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

'shouldChangeCharactersInRange' không hoạt động cho chữ cái đầu tiên, mặc dù nó chỉ xuất hiện sau khi bạn nhập chữ cái thứ hai. – KMV

+1

kiểm tra liên kết này để thay đổi chữ cái đầu tiên, nó có thể giúp bạn: http://stackoverflow.com/questions/7010547/uitextfield-text-change-event – Vishnuvardhan

0

Tính năng này hoạt động tốt trong Swift 2.2. Hy vọng điều này sẽ giúp bạn cho khoảng cách giữa các ký tự trong lĩnh vực văn bản

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) 
    } 
} 
2

Sử dụng defaultTextAttributes tài sản của UITextField. Nó sẽ xử lý việc chuyển đổi thành NSAttributedString cho bạn và áp dụng các thuộc tính bạn đã đặt. Ví dụ:

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

Không cần phải đi cho attributedText, mà phải trung thực, là một mớ hỗn độn thực hiện với khoảng cách sửa đổi. Bất cứ khi nào tôi đóng bàn phím, khoảng trống biến mất, điều này khiến tôi phải đào sâu hơn.

Mỗi UITextField có thuộc tính được gọi là defaultTextAttributes, theo Apple "trả về từ điển thuộc tính văn bản có giá trị mặc định"..Các Apple document cũng nói rằng "tài sản này được áp dụng các thuộc tính quy định cho toàn bộ văn bản của trường text"

Chỉ cần tìm một nơi thích hợp trong mã của bạn, thường là nơi textfield đang được khởi tạo và sau đó sao chép và dán sau .

trả lời trong Swift 3,0

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

nơi khoảng cách là một CGFloat. Ví dụ 2.0.

Điều này cũng phù hợp với các phông chữ khác nhau.

Chúc mừng !!


Cú pháp mới nhất có vẻ là:

yourField.defaultTextAttributes 
    .updateValue(20.0, forKey: NSAttributedStringKey.kern.rawValue) 
+1

@Fattie cảm ơn bạn đã thêm cú pháp mới nhất và cho nhận xét. :) – iOSer

Các vấn đề liên quan