【问题标题】:emoji is clipped in UILabel in iOSemoji 在 iOS 的 UILabel 中被剪辑
【发布时间】:2016-02-22 14:32:18
【问题描述】:

您好,我正在开发聊天应用程序,用户可以在其中向其他用户发送笑脸(表情符号)。对于文本,它的工作完美,但当它包含表情符号时,它是正确的。我已经为此使用了方法

- (CGSize)getSizeForText:(NSString *)text maxWidth:(CGFloat)width font:(NSString *)fontName fontSize:(float)fontSize {
    CGSize constraintSize;
    constraintSize.height = MAXFLOAT;
    constraintSize.width = width;
    NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                          [UIFont fontWithName:fontName size:fontSize], NSFontAttributeName,
                                          nil];

    CGRect frame = [text boundingRectWithSize:constraintSize
                                      options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                                   attributes:attributesDictionary
                                      context:nil];

    CGSize stringSize = frame.size;
    return stringSize;
}

结果类似于

从图片中你可以看到我想说什么以及我需要什么。当 UILabel 中有表情符号文本时,我需要在两行之间添加一些内容。任何帮助将不胜感激。提前致谢。

编辑:我已经给出了答案。但是,如果有人对此有一些快速的技巧,那对我来说会很棒。

【问题讨论】:

  • 调整字体大小。
  • 你在真机上测试过吗?
  • 是的,这些图片来自设备
  • 如何设置标签?
  • 标签在一个单元格中,我已经根据内容调整了它的大小

标签: ios objective-c chat emoji


【解决方案1】:

我已经完成了一项很好的手动操作,现在看起来对我来说很好。我为标签文本添加了行距,它对我很有用。我设置了像

这样的文本
NSMutableAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@",message_text]];
            NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
            [style setLineSpacing:4];
            [attrString addAttribute:NSParagraphStyleAttributeName
                               value:style
                               range:NSMakeRange(0, [message_text length])];
            lblChatMSG.attributedText = attrString;

我获取文本高度的方法是

- (CGSize)getSizeForText:(NSString *)text maxWidth:(CGFloat)width font:(NSString *)fontName fontSize:(float)fontSize {
    CGSize constraintSize;
    constraintSize.height = MAXFLOAT;
    constraintSize.width = width;

    NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
    paragraphStyle.alignment = NSTextAlignmentLeft;
    paragraphStyle.lineSpacing = 4;

    NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                          [UIFont fontWithName:fontName size:fontSize], NSFontAttributeName,paragraphStyle,NSParagraphStyleAttributeName,
                                          nil];

    CGRect frame = [text boundingRectWithSize:constraintSize
                                      options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                                   attributes:attributesDictionary
                                      context:nil];

    CGSize stringSize = frame.size;
    return stringSize;
} 

结果是

【讨论】:

  • 您可以使用文字语法代替dictionaryWithObjectsAndKeys。例如@{ NSFontAttributeName : [UIFont fontWithName:fontName size:fontSize], NSParagraphStyleAttributeName : paragraphStyle }
【解决方案2】:

我只是增加了标签所需的高度并调整了它的原点。

    // Expand label to avoid cutoff emojis
    label.frame.size.height += 8.0
    label.frame.origin.y -= 4.0

【讨论】:

  • 我们需要通过一些条件来限制它,否则当 cellforrow 被调用时它会继续增加高度。
  • 您可以在重新计算sizeThatFitslayoutSubviews 之后添加此高度。只是不要一直这样做。
猜你喜欢
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多