Text formatting framework written on Swift 4.0.
| Features | |
|---|---|
| 🎭 | Convert string into formatted string and vice versa |
| 🚴 | Formatting text during typing |
| #️⃣ | Set format using '#' characters like '### ##-###' |
| 📎 | Set prefix for editing string |
| 🙈 | Symbols input control with RegEx |
| 🌐 | Works with textField/textView/etc with common interface |
| 🎁 | Ready to use subclasses of UITextField and UITextView |
| 🔍 | Allows easy to set attributes for string in range |
To run the example project, clone the repo and run pod install from the Example directory first.
- iOS 8.0+
- Swift 4.0+
- Xcode 9.0+
AnyFormatKit is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'AnyFormatKit'Then, run the following command:
$ pod installTo integrate AnyFormatKit into your Xcode project using Carthage, specify it in your Cartfile:
github "luximetr/AnyFormatKit" ~> 0.1.1
Run carthage update to build the framework and drag the built AnyFormatKit.framework into your Xcode project.
import AnyFormatKitlet phoneFormatter = TextFormatter(textPattern: "### (###) ###-##-##")
phoneFormatter.formattedText(from: "+123456789012") // +12 (345) 678-90-12
let customFormatter = TextFormatter(textPattern: "###-###custom###-###")
customFormatter.formattedText(from: "111222333444") // 111-222custom333-444You can also set your own symbol in the pattern
let cardFormatter = TextFormatter(textPattern: "XXXX XXXX XXXX XXXX", patternSymbol: "X")
cardFormatter.formattedText(from: "4444555566667777") // 4444 5555 6666 7777For string with different length
let formatter = TextFormatter(textPattern: "## ###-##")
formatter.formattedText(from: "1234") // 12 34
formatter.formattedText(from: "123456789") // 12 345-67Unformatting
let formatter = TextFormatter(textPattern: "## ###-##")
formatter.unformattedText(from: "99 888-77") // 9988877It is necessary to create TextInputController instance with formatter for formatting during typing. You need to implement TextInput protocol in your own UITextField/UITextView/something else or use ready solutions (TextInputField/TextInputView) by subclassing. It is necessary to set controllers's textInput property.
let textInputController = TextInputController()
let textInput = TextInputField() // or TextInputView or any TextInput
textInputController.textInput = textInput // setting textInput
let formatter = TextInputFormatter(textPattern: "### (###) ###-##-##", prefix: "+12")
textInputController.formatter = formatter // setting formatterThe controller listens textInput(_:shouldChangeCharactersIn:replacementString:) delegate method. But you can also add more than one delegate if needed. Methods of the delegates, that should return Bool value gather using && operator. Therefore, if one of the delegates returns false, that means that textInput will receive false. If you want to send true to textInput, all delegates must return true.
You can set allowedSymbolsRegex to the formatter to filter input symbols with the RegEx. All symbols, that satisfy the RegEx will be available for typing in the textInput.
This property only applies to inputed symbols from the keyboard, but not to the prefix.
inputFieldFormatter.allowedSymbolsRegex = "[0-9]" // allowed only numbersTo set attributes for string at range use addAttributes(_:range:) method for textInput.
textInput.addAttributes([.foregroundColor : UIColor.lightGray], range: NSRange(location: 0, length: 3))luximetr, alexandr.orlov@brander.ua
AnyFormatKit is available under the MIT license. See the LICENSE file for more info.

