pod 'InputBarAccessoryView'github "nathantannar4/InputBarAccessoryView"Add your app to the list of apps using this library and make a pull request.
- MessageKit (renamed to MessageInputBar)
iOS 9.0+ Swift 4 XCode 9.0+
The layout of the InputBarAccessoryView is made of of 4 UIStackView's and an InputTextView (subclass of UITextView). The padding of the subviews can be easily adjusted by changing the padding and textViewPadding properties. The constraints will automatically be updated.
It is important to note that each of the UIStackView's to the left and right of the InputTextView are anchored by a width constraint. This way the InputTextView will always fill the space inbetween in addition to providing methods that can easily be called to hide all buttons to the right or left of the InputTextView by setting the width constraint constant to 0. The bottom and top stack views are not height constraint and rely on their intrinsicContentSize
func setLeftStackViewWidthConstant(to newValue: CGFloat, animated: Bool)
func setRightStackViewWidthConstant(to newValue: CGFloat, animated: Bool)The AutocompleteManager holds the logic and views required for the autocomplete functionality which makes it easy to subclass and modify if you wish to add additional logic! Then you can set the MessageInputBar's autocompleteManager property to your own
/// If the autocomplete matches should be made by casting the strings to lowercase
open var isCaseSensitive = false
/// When TRUE, autocompleted text will be highlighted with the UITextView's tintColor with an alpha component
open var highlightAutocompletes = true
/// The max visible rows visible in the autocomplete table before the user has to scroll throught them
open var maxVisibleRows = 3
/// The prefices that the manager will recognize
open var autocompletePrefixes: [Character] = ["@","#"]By default an AutocompleteCell is returned to the AutocompleteManager thats title labels text is bolded to match the entered text.
// The autocomplete options for a given prefix. Called once when a prefix is entered and then cached until the prefix is unregistered
func autocomplete(_ autocompleteManager: AutocompleteManager, autocompleteTextFor prefix: Character) -> [String]
// Configure the cell to display in the `UITableView`
func autocomplete(_ autocompleteManager: AutocompleteManager, tableView: UITableView, cellForRowAt indexPath: IndexPath, for arguments: (char: Character, filterText: String, autocompleteText: String)) -> UITableViewCellfunc autocomplete(_ autocompleteManager: AutocompleteManager, didComplete prefix: Character, with text: String)It is recommended that you use the InputBarButtonItem for the UIStackView's. This is because all UIStackView's are intitially set with the following properties:
let view = UIStackView()
view.axis = .horizontal
view.distribution = .fill
view.alignment = .fill
view.spacing = 15This will layout the arrangedViews based on their intrinsicContentSize and if there is extra space the views will be expanded based on their content hugging UILayoutPriority.
Each InputBarButtonItem's intrinsicContentSize can be overridden by setting the size property. It is optional so when set to nil the super.intrinsicContentSize will be used.
Spacing can be set using the spacing property. This will change the content hugging UILayoutPriority and add extra space to the intrinsicContentSize when set to .fixed(CGFloat).
Each InputBarButtonItem has properties that can hold actions that will be executed during various hooks such as the button being touched, the UITextView text changing and more! Thanks to these easy hooks with a few lines of code the items can be easily resized and animated similar to that of the Facebook messenger app.
// MARK: - Hooks
public typealias InputBarButtonItemAction = ((InputBarButtonItem) -> Void)
private var onTouchUpInsideAction: InputBarButtonItemAction?
private var onKeyboardEditingBeginsAction: InputBarButtonItemAction?
private var onKeyboardEditingEndsAction: InputBarButtonItemAction?
private var onKeyboardSwipeGestureAction: ((InputBarButtonItem, UISwipeGestureRecognizer) -> Void)?
private var onTextViewDidChangeAction: ((InputBarButtonItem, InputTextView) -> Void)?
private var onSelectedAction: InputBarButtonItemAction?
private var onDeselectedAction: InputBarButtonItemAction?
private var onEnabledAction: InputBarButtonItemAction?
private var onDisabledAction: InputBarButtonItemAction?func inputBar(_ inputBar: InputBarAccessoryView, didPressSendButtonWith text: String)
// Useful for updating a UICollectionView or UITableView bottom inset
func inputBar(_ inputBar: InputBarAccessoryView, didChangeIntrinsicContentTo size: CGSize)
func inputBar(_ inputBar: InputBarAccessoryView, textViewTextDidChangeTo text: String)
func inputBar(_ inputBar: InputBarAccessoryView, didSwipeTextViewWith gesture: UISwipeGestureRecognizer)Have a suggestion? Make a PR!
- 1.2.0
- Better XCode docs
-
InputItemis now a protocol that you can give to theInputBarAccessoryView-InputManageris now a protocol that you can conform to make a plugin -AutocompleteManagerandAttactchmentManagerare no longer members ofInputBarAccessoryViewby default. You will need to create them and assign them to theinputManagerproperty of theInputBarAccessoryView - 1.1.2
- Fixed issue where adjusting the
InputTextView's placeholder text alignment didn't work - Fixed iPhone X support where the home indicator overlapped theInputTextView - 1.1.1 - AutocompleteManager bug fixes and customization improvements
- 1.1.0 - AttactchmentManager (Beta)
- 1.0.0
- A more refined AutocompleteManager
- Auto-layout bug fixes
pre-release versions not documented
Find a bug? Open an issue!
Nathan Tannar - https://nathantannar.me
Distributed under the MIT license. See LICENSE for more information.









