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 install
To integrate AnyFormatKit into your Xcode project using Carthage, specify it in your Cartfile
:
github "luximetr/AnyFormatKit" ~> 0.2.0
Run carthage update
to build the framework and drag the built AnyFormatKit.framework
into your Xcode project.
import AnyFormatKit
let phoneFormatter = TextFormatter(textPattern: "### (###) ###-##-##")
phoneFormatter.formattedText(from: "+123456789012") // +12 (345) 678-90-12
let customFormatter = TextFormatter(textPattern: "###-###custom###-###")
customFormatter.formattedText(from: "111222333444") // 111-222custom333-444
You 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 7777
For string with different length
let formatter = TextFormatter(textPattern: "## ###-##")
formatter.formattedText(from: "1234") // 12 34
formatter.formattedText(from: "123456789") // 12 345-67
Unformatting
let formatter = TextFormatter(textPattern: "## ###-##")
formatter.unformattedText(from: "99 888-77") // 9988877
It 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 formatter
The 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 numbers
To set attributes for string at range use addAttributes(_:range:)
method for textInput
.
textInput.addAttributes([.foregroundColor : UIColor.lightGray], range: NSRange(location: 0, length: 3))
luximetr, [email protected]
AnyFormatKit is available under the MIT license. See the LICENSE file for more info.