molon / MLLabel

UILabel replacement with TextKit. Support link and expression.
MIT License
723 stars 115 forks source link

How to make custom expression's size equal the emoji. #39

Closed smithereensarr closed 8 years ago

smithereensarr commented 8 years ago

就用中文说好了😅,你这个demo如果用很大的字体,表情也会显得特别大,不如emoji随着字体大小的变化而变化的自然。我摸索了半天,始终找不到emoji的location和size与font的关系,好像完全没规律似的!所以想请教一下你有什么好的办法,能让第三方表情缩放到跟emoji一模一样,达到跟emoji完全一致的渲染效果。Well As far as I am concerned, it is impossible.

molon commented 8 years ago

@wangweiarr MLExpressionManager.m里的kExpressionLineHeightMultiple 调整为0.8f的话大概和emoji的差不多大。 而说到渲染效果的话就很尴尬了,库里的微信表情并不是矢量图,而emoji是矢量图,所以放大之后肯定会模糊。

smithereensarr commented 8 years ago

非常感谢,然而我只是想知道emoji尺寸的规律。比如您的“ kExpressionLineHeightMultiple”参数值设置为0.8时 10point的字体表情会比emoji小,而50point字体时表情会比emoji大,所以……

molon commented 8 years ago

@wangweiarr 无非就是根据表情字符的当前字体的lineHeight,来进行等比例缩放。 然后具体喜欢怎么调整,你自己可以尝试下。 至于你说的比如,我也不知道它比较细节的规律是什么,但是真心觉得没必要关心这个事。 非要一模一样的话,帮不了你了。Sorry...

//重写以返回附件的大小
- (CGRect)attachmentBoundsForTextContainer:(NSTextContainer *)textContainer proposedLineFragment:(CGRect)lineFrag glyphPosition:(CGPoint)position characterIndex:(NSUInteger)charIndex
{
    if (self.imageBlock)
    {
        CGFloat width = self.width;
        CGFloat height = self.height;

        // 找到其是否有设置字体,如果有,就根据字体的descender调整下位置,以及lineHeight调整大小
        UIFont *font = [textContainer.layoutManager.textStorage attribute:NSFontAttributeName
                                                                  atIndex:charIndex
                                                           effectiveRange:nil];
        CGFloat baseLineHeight = (font?font.lineHeight:lineFrag.size.height);

        if (self.lineHeightMultiple>0) {
            width = height = baseLineHeight*self.lineHeightMultiple;
            if (self.imageAspectRatio>0) {
                width = height*self.imageAspectRatio;
            }
        }else{
            if (width==0&&height==0) {
                width = height = lineFrag.size.height;
            }else if (width==0&&height!=0) {
                width = height;
            }else if (height==0&&width!=0) {
                height = width;
            }
        }

        CGFloat y = font.descender;
        y -= (height-baseLineHeight)/2;

        return CGRectMake(0, y, width, height);

    }

    return [super attachmentBoundsForTextContainer:textContainer proposedLineFragment:lineFrag glyphPosition:position characterIndex:charIndex];
}
smithereensarr commented 8 years ago

感谢,其实我就是想问楼主有没有办法了解,或者已知emoji和文字大小规律,现在看来确实没法知道,只能自己针对特别的字号自己调整才能达到目的。也许就像楼主说的,这个真没什么必要,是强迫症吧了😅。。

molon commented 8 years ago

@wangweiarr :) 有其他问题再交流。