Skip to content

Instantly share code, notes, and snippets.

@dgyesbreghs
Last active August 28, 2017 09:03
Show Gist options
  • Save dgyesbreghs/f2139e73f9167c301c87b68291ff1695 to your computer and use it in GitHub Desktop.
Save dgyesbreghs/f2139e73f9167c301c87b68291ff1695 to your computer and use it in GitHub Desktop.
IBANTextField (Swift 3.1)
//
// 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