Как реализовать пользовательский JSQMessagesInputToolbar
Можно ли реализовать пользовательский JSQMessagesInputToolbar для http://www.jessesquires.com/JSQMessagesViewController/?
Мне нужно установить кастом UIToolbar
, но inputToolbar
свойство класса JSQMessagesViewController
только для чтения и инициализируется из .xib
, так что я понятия не имею, как вставить переопределенную реализацию JSQMessagesInputToolbar
,
3 ответа
Создайте категорию и замените реализацию методаloadToolbarContentView. Это в основном заменяет реализацию исходной функции на определенную вами функцию.
Поэтому создайте категорию со следующим файлом.h:
#import <JSQMessagesViewController/JSQMessagesViewController.h>
@interface JSQMessagesInputToolbar (InputCategory)
@end
И следующий файл.m
#import "JSQMessagesInputToolbar+InputCategory.h"
@implementation JSQMessagesInputToolbar (InputCategory)
- (JSQMessagesToolbarContentView *)loadToolbarContentView
{
//this is called once in the loadNib and returns the toolbar
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"updatedXib" owner:self options:nil];
return topLevelObjects.firstObject;
//self.preferredDefaultHeight = 84.0f; this could also be useful
}
@end
Возможно, вы также захотите расширить реализацию JSQMessagesViewController для обработки конкретного поведения обновленных элементов пользовательского интерфейса Xib.
Я сталкиваюсь с тем же вопросом, поэтому я исследую проблемы JSQMessagesViewController;
Проблема 358: сказано, что автор не собирается поддерживать это в ближайшее время, потому что другие функции имеют более высокий приоритет, и никто больше не просил об этом. И автор предлагает нам раскошелиться и настроить его.
Другая проблема задает тот же вопрос, и есть пример использования Frame для добавления второй кнопки.
Я не думаю, что это хороший пример.
Я думаю, что мое демо ниже лучше.
в viewDidLoad
метод JSQMessagesViewController
или подкласс
UIButton *btn=[UIButton buttonWithType:UIButtonTypeContactAdd];
JSQMessagesToolbarContentView *contentView= self.inputToolbar.contentView;
[contentView.leftBarButtonContainerView addSubview:btn];//add the new button
contentView.leftBarButtonItemWidth=66; //make containerView wider to hold more buttons
//remove unused leftBarButtonItem constraint
for (NSLayoutConstraint *constraint in contentView.leftBarButtonItem.superview.constraints) {
if(constraint.secondItem ==contentView.leftBarButtonItem &&constraint.firstAttribute ==NSLayoutAttributeLeading){
constraint.active=NO;
}
}
// update two button constraint
[contentView.leftBarButtonItem mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo(@30);
}];
[btn mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(btn.superview.mas_top);
make.bottom.equalTo(btn.superview.mas_bottom);
make.left.equalTo(btn.mas_left);
make.width.equalTo(@30);
}];
Результат как это: InputToolBarContent
Swift 3 версия ответа Шона Вана
let button = UIButton(type: .infoDark)
if let contentView = self.inputToolbar.contentView {
contentView.leftBarButtonContainerView.addSubview(button)
contentView.leftBarButtonItemWidth = 66
for constraint in contentView.leftBarButtonItem.superview!.constraints {
if (constraint.secondItem as? UIButton) == contentView.leftBarButtonItem && constraint.firstAttribute == .leading {
constraint.isActive = false
}
}
contentView.leftBarButtonItem.snp.makeConstraints({ (make) in
make.width.equalTo(30)
})
button.snp.makeConstraints({ (make) in
make.top.equalTo(button.superview!.snp.top)
make.bottom.equalTo(button.superview!.snp.bottom);
make.left.equalTo(3);
make.width.equalTo(30);
})
}
Я использовал SnapKit для autoLayout