Last active
August 28, 2017 09:03
-
-
Save dgyesbreghs/f2139e73f9167c301c87b68291ff1695 to your computer and use it in GitHub Desktop.
IBANTextField (Swift 3.1)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// IBANTextField.swift | |
// IBAN | |
// | |
// Created by Dylan Gyesbreghs on 27/08/2017. | |
// Copyright © 2017 Dylan Gyesbreghs. All rights reserved. | |
// | |
import UIKit | |
// MARK: - Properties | |
class IBANTextField: UITextField { | |
fileprivate let separator = " " | |
} | |
// MARK: - Override methods | |
extension IBANTextField { | |
override func awakeFromNib() { | |
super.awakeFromNib() | |
overrideProperties() | |
setupView() | |
setupAction() | |
} | |
override func textRect(forBounds bounds: CGRect) -> CGRect { | |
return bounds.insetBy(dx: 10, dy: 10) | |
} | |
override func editingRect(forBounds bounds: CGRect) -> CGRect { | |
return bounds.insetBy(dx: 10, dy: 10) | |
} | |
} | |
// MARK: - Setup Methods | |
fileprivate extension IBANTextField { | |
func overrideProperties() { | |
spellCheckingType = .no | |
autocorrectionType = .no | |
autocapitalizationType = .allCharacters | |
} | |
func setupView() { | |
self.layer.borderColor = UIColor.green.cgColor | |
self.layer.borderWidth = 2 | |
} | |
func setupAction() { | |
addTarget(self, action: #selector(textFieldDidBegin(_:)), for: .editingDidBegin) | |
addTarget(self, action: #selector(textFieldDidEnd(_:)), for: .editingDidEnd) | |
} | |
} | |
// MARK: - Actions | |
extension IBANTextField { | |
func textFieldDidBegin(_ textField: UITextField) { | |
guard var text = textField.text else { return } | |
text.remove(separator: separator) | |
textField.text = text | |
} | |
func textFieldDidEnd(_ textField: UITextField) { | |
guard var text = textField.text else { return } | |
text.insert(separator: separator, every: 4) | |
textField.text = text | |
} | |
} | |
fileprivate extension String { | |
// MARK: - Insert a separator | |
mutating func insert(separator: String, every n: Int) { | |
self = inserting(separator: separator, every: n) | |
} | |
func inserting(separator: String, every n: Int) -> String { | |
var result: String = "" | |
let characters = Array(self.characters) | |
stride(from: 0, to: characters.count, by: n).forEach { | |
result += String(characters[$0..<min($0+n, characters.count)]) | |
if $0+n < characters.count { | |
result += separator | |
} | |
} | |
return result | |
} | |
// MARK: - Remove a separator | |
mutating func remove(separator: String) { | |
self = removing(separator: separator) | |
} | |
func removing(separator: String) -> String { | |
var result: String = "" | |
let characters = Array(self.characters) | |
for character in characters { | |
if String(character) != separator { | |
result += String(character) | |
} | |
} | |
return result | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment