2

Is it possible to implement custom JSQMessagesInputToolbar for JSQMessagesViewController?

I need to set custom UIToolbar, but inputToolbar property of class JSQMessagesViewController is readonly and initialized from .xib, so I have no idea how to insert overridden implementation of JSQMessagesInputToolbar.

4

3 回答 3

1

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

issue 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

于 2016-03-08T17:31:06.063 回答
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 元素的特定行为。

于 2015-12-20T15:35:31.947 回答
0

Swift 3 版本Shawn Wang 的回答

        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进行自动布局

于 2017-06-09T12:48:08.050 回答