如何实现自定义JSQMessagesInputToolbar

时间:2015-10-08 14:57:21

标签: ios objective-c chat jsqmessagesviewcontroller

是否可以为JSQMessagesInputToolbar实施自定义JSQMessagesViewController

我需要设置自定义UIToolbar,但类inputToolbar的{​​{1}} property只能从JSQMessagesViewController读取并初始化,所以我不知道如何插入.xib的重写实现。

3 个答案:

答案 0 :(得分:1)

创建一个Category并替换该方法的实现 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 的实现来处理updatedXib UI元素的特定行为。

答案 1 :(得分:1)

我面临同样的问题,所以我探讨了JSQMessagesViewController问题;

问题358:说作者不会很快支持这个,因为其他功能具有更高的优先级,没有其他人请求这个。作者建议我们分叉并自定义它。

The other issue提出了同样的问题,并且有一个示例使用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

答案 2 :(得分:0)

Swift 3 version of Shawn Wang's answer

        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);
            })
        }

I have used SnapKit for autoLayout