是否可以为JSQMessagesInputToolbar实施自定义JSQMessagesViewController?
我需要设置自定义UIToolbar
,但类inputToolbar
的{{1}} property只能从JSQMessagesViewController
读取并初始化,所以我不知道如何插入.xib
的重写实现。
答案 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