MessageViewController
A SlackTextViewController replacement written in Swift for the iPhone X.
Installation
Just add MessageViewController
to your Podfile and install. Done!
pod 'MessageViewController'
Setup
You must subclass MessageViewController
.
import MessageViewController
class ViewController: MessageViewController {
// ...
}
Finish setup using a UIScrollView
. Remember this can also be a UITableView
or UICollectionView
.
func viewDidLoad() {
super.viewDidLoad()
setup(scrollView: scrollView)
}
Customizations
You can customize any part of the UI that you want!
// Border between the text view and the scroll view
borderColor = .lightGray
// Change the appearance of the text view and its content
messageView.inset = UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)
messageView.textView.placeholderText = "New message..."
messageView.textView.placeholderTextColor = .lightGray
messageView.font = .systemFont(ofSize: 17)
// Setup the button using text or an icon
messageView.set(buttonTitle: "Send", for: .normal)
messageView.addButton(target: self, action: #selector(onButton))
messageView.buttonTint = .blue
// Set custom attributes for an autocompleted string
let tintColor = .blue
messageAutocompleteController.autocompleteTextAttributes = ["@": [.font: UIFont.preferredFont(forTextStyle: .body), .foregroundColor: tintColor, .backgroundColor: tintColor.withAlphaComponent(0.1)]]
Autocomplete
The base view controller uses a MessageAutocompleteController
control to handle text autocompletion.
This control uses a plain UITableView
to display its autocomplete. Add a dataSource
and delegate
to display and handle interactions.
let tableView = messageAutocompleteController.tableView
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
tableView.dataSource = self
tableView.delegate = self
Then register for autocomplete prefixes you want to respond to and set a delegate
to handle when a prefix is found.
messageAutocompleteController.register(prefix: "@")
messageAutocompleteController.delegate = self
Your delegate needs to implement just one method.
func didFind(controller: MessageAutocompleteController, prefix: String, word: String) {
// filter your data
controller.show(true)
}
Note: You can perform asyncronous autocomplete searches. Just be sure to call
messageAutocompleteController.show()
when finished.