#XGBarrage-implementation
用完全绘制的方式实现弹幕及自定义表情和系统键盘间切换
项目功能介绍:
1️⃣用完全绘制的方式来实现弹幕的内容;
2️⃣实现自定义表情键盘和系统键盘之间的切换功能;
3️⃣实现通过放大器来查看选中表情的功能;
4️⃣用Switch开关来实现弹幕的显示与隐藏功能;
5️⃣通过是否输入弹幕的内容来监听“发送”按钮是否可用;
6️⃣对自定义表情键盘进行单独的抽取和封装,可以单独使用;
7️⃣对绘制弹幕的方法进行单独的抽取和疯转,可以单独使用;
8️⃣实现对计算文字的真实尺寸的方法进行封装;
9️⃣可实现全屏(或满屏)弹幕的功能;
绘制弹幕内容的部分代码:
+(XGImage *)xg_imageWithBarrage:(XGBarrageModel *)barrage{
CGFloat marginX = 5;
CGFloat expressionW = XGBarrageExpressionW;
CGFloat expressionH = expressionW;
CGFloat iconW = XGBarrageH;
CGFloat iconH = iconW;
CGSize userNameSize = [barrage.userName sizeWithFont:XGBarrageUserNameFont maxSize:CGSizeMake(MAXFLOAT, MAXFLOAT)];
CGSize contentSize = [barrage.content sizeWithFont:XGBarrageContentFont maxSize:CGSizeMake(MAXFLOAT, MAXFLOAT)];
CGFloat contentTextW = iconH + marginX * 4 + userNameSize.width + contentSize.width + barrage.expression.count * expressionH;
CGFloat contentTextH = XGBarrageH;
CGSize contentTextSize = CGSizeMake(contentTextW, contentTextH);
UIGraphicsBeginImageContextWithOptions(contentTextSize, NO, 0.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, iconW, iconH));
UIImage *icon = [UIImage imageNamed:barrage.icon];
CGContextClip(ctx);
[icon drawInRect:CGRectMake(0, 0, iconW, iconH)];
CGContextRestoreGState(ctx);
CGFloat bgX = iconW + marginX;
CGFloat bgW = contentTextW - bgX;
CGRect bgF = CGRectMake(bgX, 0, bgW, contentTextH);
barrage.type ? [[UIColor clearColor] set] : [[UIColor clearColor] set];
[[UIBezierPath bezierPathWithRoundedRect:bgF cornerRadius:XGBarrageH * 0.5] fill];
CGFloat userNameX = bgX + marginX;
CGFloat userNameY = (contentTextH - userNameSize.height) * 0.5;
[barrage.userName drawAtPoint:CGPointMake(userNameX, userNameY) withAttributes:@{NSFontAttributeName:XGBarrageUserNameFont,NSForegroundColorAttributeName:barrage.type ? [UIColor magentaColor] : [UIColor redColor]}];
CGFloat contentX = userNameX + userNameSize.width + marginX;
[barrage.content drawAtPoint:CGPointMake(contentX, userNameY) withAttributes:@{NSFontAttributeName:XGBarrageContentFont,NSForegroundColorAttributeName:barrage.type ? [UIColor whiteColor] : [UIColor whiteColor]}];
__block CGFloat expressionX = contentX + contentSize.width;
CGFloat expressionY = (contentTextH - expressionH) * 0.5;
[barrage.expression enumerateObjectsUsingBlock:^(NSString *expressionName, NSUInteger idx, BOOL * _Nonnull stop) {
UIImage *expression = [UIImage imageNamed:expressionName];
[expression drawInRect:CGRectMake(expressionX, expressionY, expressionW, expressionH)];
expressionX += expressionW;
}];
// 从当前位图上下文获得图片
UIImage *userIcon = UIGraphicsGetImageFromCurrentImageContext();
// 结束上下文
UIGraphicsEndImageContext();
ctx = nil;
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )