美文网首页
YYlable正确使用姿势

YYlable正确使用姿势

作者: xiaoliang1 | 来源:发表于2018-12-17 13:47 被阅读201次

之前在上家公司为了优化app,引入了YYlable。我也不怎么会用。结果网上一堆autolayout+yylable的使用姿势让我非常不爽,要计算宽和高。感觉这又回到了frame时代。

(周末和朋友吃饭,说到现在面试的什么runtime,runloop,afn,sdimage源码,感觉现在解读的效果就这样。有的工作人少工作量多,那像有些公司没事去阅读源码。再说你倒阅读后出来点效果啊,也就是现在网上好多什么afn,sdimage源码解析,看看之后就拿来当面试的问题了,感觉这些并不能作为是否能胜任或者技术好坏的评判标准)

经过一番研究得出的结论,是根本不用计算宽和高的。网上有很多解析源代码的。但是使用的时候和demo感觉,不像会使用yyLable。
下面先来说你们的使用方法

YYLabel *lable1 = [[YYLabel alloc] init];

    NSAttributedString *arrt1 = [[NSAttributedString alloc] initWithString:@"你们的写法,计算containerWithSize的写法"];

    CGSize size1 = [arrt1 boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:NULL].size;
    YYTextContainer *yyContainer1 = [YYTextContainer containerWithSize:size1];
    lable1.textLayout = [YYTextLayout layoutWithContainer:yyContainer1 text:arrt1];
    lable1.backgroundColor = [UIColor redColor];
    [self.view addSubview:lable1];
    [lable1 mas_makeConstraints:^(MASConstraintMaker *make) {

        make.left.equalTo(@(15));
        make.top.equalTo(@(100));
        make.width.equalTo(@(size1.width));
        make.height.equalTo(@(size1.height));
    }];

跑起来一切完美,没有出错。但是这种思维方式感觉回到了freame时代,这里autolayout感觉可有可无。真是感觉不爽。

那我说说我的使用方法:

YYLabel *lable1 = [[YYLabel alloc] init];

    NSAttributedString *arrt1 = [[NSAttributedString alloc] initWithString:@"我的的写法,不计算containerWithSize的写法,设置对齐方式"];
    YYTextContainer *yyContainer1 = [YYTextContainer containerWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)];
    lable1.textLayout = [YYTextLayout layoutWithContainer:yyContainer1 text:arrt1];
    lable1.backgroundColor = [UIColor redColor];
    lable1.textAlignment = NSTextAlignmentRight;
    [self.view addSubview:lable1];
    [lable1 mas_makeConstraints:^(MASConstraintMaker *make) {

        make.right.equalTo(@(-15));
        make.top.equalTo(@(160));
    }];

是不是感觉正常的aulayout一样,像使用系统的UILable一样加约束。少了计算,真是爽。那为什么不设置宽和高也可以啊。这要结合自适应宽和高来说:

Note that not all views have an intrinsicContentSize.  UIView's default implementation is to return (UIViewNoIntrinsicMetric, UIViewNoIntrinsicMetric).  The _intrinsic_ content size is concerned only with data that is in the view itself, not in other views. Remember that you can also set constant width or height constraints on any view, and you don't need to override instrinsicContentSize if these dimensions won't be changing with changing view content.
- (CGSize)intrinsicContentSize NS_AVAILABLE_IOS(6_0);

从这里我看出UILable为什么能自适应高和宽,因为内部重写并实现intrinsicContentSize这个方法,其他控件不行就是没实现这个方法或者返回(UIViewNoIntrinsicMetric, UIViewNoIntrinsicMetric);
下面是官方的解说:


QQ20181217-130308@2x.png

其实YYlable已经实现了这个方法(YYLable有个BUG会在下面说到),我截图给你们看:


QQ20181217-130500@2x.png

其实YYLable也可以使用xib进行autolayout约束的,而且不用设置宽和高,并且没有报错:


QQ20181217-130659@2x.png

另外我发现官方xocde10已经修复了这玩意之前版本的报错,在之前xocde版本上回报错的,但是还是有解决方案的:


QQ20181217-131014@2x.png QQ20181217-131001@2x.png

只要吧Ambiguity选项改为Verify Postion Only即可,可能苹果自己他也考虑到这一点。所以添加了这一选项。不过xcode10构建的版本大可不必考虑此选项。

YYlable也是有BUG的,在自适应宽和高的时候。只要设置文本对齐方式为NSTextAlignmentRight或者NSTextAlignmentCenter会出现计算文本错误的BUG。来看一下BUG吧


QQ20181217-131853@2x.png

经过我研究发现


QQ20181217-132038@2x.png

发现在实现- (CGSize)intrinsicContentSize中就算宽和高错误导致的,用layout.textBoundingRect.size得到的值是正确的,而用layout.textBoundingSize返回的是一个无穷大的负值。其实我也不太懂排版,所以就在这里改了,按说textBoundingRect.size和textBoundingSize应该是相等的,这里却出现了这样的奇葩BUG。
还好我自己修改了一份:
在自己的项目这样使用了:

pod 'YYKit', :git => 'https://github.com/LoveSVN/YYKit.git'

那我自己也写了一份demo.
下面会提供官方的yylable的demo和我修改后的demo;
https://github.com/LoveSVN/yylableSimplyUse
demo1是用官方yylable写的。demo2是我修改后的demo

相关文章

网友评论

      本文标题:YYlable正确使用姿势

      本文链接:https://www.haomeiwen.com/subject/phbqkqtx.html