Как реализовать пользовательский 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

Другие вопросы по тегам