自定样式

界面组件 PDBotKit 中提供的所有消息的标准显示样式,如果你对当前UI效果不满意,可以自定义消息样式。
自定义消息样式需要新建一个视图类,继承 PDUIMessageBaseCell,并在控制器中注册,替换相应消息类型的单元视图。
下面以自定义文字消息为例,介绍自定义消息样式步骤。

1. 新建消息单元视图
#import <PDBotKit/PDBotKit.h>

@interface MyMessageTextCell : PDUIMessageBaseCell
@end
2. 添加自定义界面子对象
@property (nonatomic, strong) UILabel* _Nonnull textMessageLabel;
3. 重写父类中的方法
// 初始化方法,完成界面子对象的创建
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(nullable NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self)
    {
        self.textMessageLabel = [[UILabel alloc] initWithFrame:CGRectMake(8, 0, self.messageContentView.bounds.size.width-16, self.messageContentView.bounds.size.height)];
        self.textMessageLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        self.textMessageLabel.textAlignment = NSTextAlignmentLeft;
        self.textMessageLabel.numberOfLines = 0;
        self.textMessageLabel.backgroundColor = [UIColor clearColor];
        self.textMessageLabel.textColor = [UIColor redColor];
        self.textMessageLabel.font = [UIFont systemFontOfSize:18];
        self.textMessageLabel.lineBreakMode = NSLineBreakByWordWrapping;
        [self.messageContentView addSubview:self.textMessageLabel];
    }
    return self;
}

// 根据传入的消息模型更新界面
- (void)setMessageModel:(PDUIMessageModel*)model
{
    [super setMessageModel:model];

    PDMessageContentText* content = (PDMessageContentText*)model.content;
    if (![content isKindOfClass:[PDMessageContentText class]]) return;

    self.textMessageLabel.text = content.text;
}

// 根据传入的消息模型计算消息内容显示区域的大小,注意只需计算自定义区域即可,不用考虑头像等公共区域
+ (CGSize)contentSizeForMessage:(nonnull PDUIMessageModel*)model withMaxWidth:(CGFloat)maxWidth
{
    PDMessageContentText* content = (PDMessageContentText*)model.content;
    if (![content isKindOfClass:[PDMessageContentText class]]) return CGSizeZero;

    NSDictionary* attributes = @{ NSFontAttributeName:[UIFont systemFontOfSize:18] };
    CGSize size = [content.text boundingRectWithSize: CGSizeMake(maxWidth-16, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size;
    size.width = ceilf(size.width + 16);
    size.height = ceilf(size.height + 16);
    return size;
}
4. 在控制器中注册自定义消息单元视图
// 自定义界面控制器,继承 PDUIChatController
@interface BotChatViewController : PDUIChatController
@end
#import "MyMessageTextCell.h"
- (void)viewDidLoad
{
    [super viewDidLoad];

    // 为PDMessageContentTypeText类型消息注册自定义消息视图
    [self registerCellClass:[MyMessageTextCell class] forMessageType:PDMessageContentTypeText];
}

运行程序,即可看到自定义效果。

results matching ""

    No results matching ""