iOS UILable换行相关设置

1、 在里面输入换行符

NSString* string = [NSStringstringWithFormat:@"XXXX电话:%@\n关于包场疑问可致电店内服务人员"shopPhone];

lable.numberOfLines0;//这句一定要写

不用担心会把它当做字符串打印出来,最终的确是有换行体现的


2、设置lable根据内容自动换行(iOS7.0 以前)

UILabel *label = [[UILabelalloc]init];

   NSString *text = @"这是一个测试!!!丹青卷,铁扇昼白,望红尘,韶华如笋,夜色似我。盈亏损,银沙,隐洒,又似薄纱,可观可感不可及";

    label.text = text;

    //设置多行

    [label setNumberOfLines:0];

    //设置剪切模式

    label.lineBreakModeNSLineBreakByWordWrapping;

    //使用系统

    UIFont* font = [UIFontsystemFontOfSize:15];

    //有导入其他字体时可用这个 UIFont *font = [UIFont fontWithName:@"Arial" size:15];

    label.font = font;

    //设置lable的最大尺寸

    CGSize constraint =CGSizeMake(300,20000.0f);

    //该方法iOS7.0以后已更新

    CGSize size = [text sizeWithFont:font constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

    //其实UILineBreakModeWordWrap和NSLineBreakByWordWrapping是一个意思

    //根据文字重设label的宽高,x y随意

    [label setFrame:CGRectMake(00, size.width, size.height)];

    [self.view addSubview:label];

我发现使用这个方法设置label的尺寸后,文字总是显示在label的上下左右正中央,设置了label的背景色后发现有一部分多余的地方,设置了对齐方式但显示效果又不是我期望的样子,不过最终影响不大。

3、设置lable根据内容自动换行(iOS7.0 以后)

NSString* string =@"这是一个测试!!!丹青卷,铁扇昼白,望红尘,韶华如笋,夜色似我。盈亏损,银沙,隐洒,又似薄纱,可观可感不可及";

    //设定最大范围

    CGSize maxSize =CGSizeMake(300,CGFLOAT_MAX);

    ///排版字符串格式

    NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOriginNSStringDrawingUsesFontLeading;

    ///段落换行模式

    NSMutableParagraphStyle* style = [[NSMutableParagraphStyle allocinit];

    [style setLineBreakMode:NSLineBreakByWordWrapping];

    ///字体

    UIFont* font = [UIFontsystemFontOfSize:15];

    //封装属性

    NSDictionary* attributes =@{NSFontAttributeName:font, NSParagraphStyleAttributeName:style};

    //调用方法 context这里我也不是很清楚到底是个什么意思,据说是文本绘制的规范定义,但不知设置有什么作用带来什么效果,不过一般都设为nil即可

    CGRect rect = [stringboundingRectWithSize:maxSizeoptions:options attributes:attributes context:nil];

    lable.size = rect.size;

本人用这个方法起初碰了不少壁,对于这些麻烦有多的属性真心是不懂为什么那么多,上面的注释也仅代表本人对这些属性的理解;我也查看了很多博客什么的文章,有作者说在这里调用这个方法设置高度有个比较坑的地方是如果字符串中有“\n \r”等换行 加空格的地方它会把这个加进去计算,于是会出现多一行的结果,不过我无论新的还是原来的都没有遇到过,包括“\n”换行符的忽略我不是很明白,我在test上测试同样是一句话中有换行符,换行符个数也相同,可是两句话自适应的结果不一样,至今还不清楚到底为什么,有能者遇到并了解的希望给我留言告知我一下,谢谢!

4、自己写了一个稍微省事一点的方法

//传入字符串,最大尺寸,字体大小和行间距获得字串的自适应大小,想设默认行间距就传0.0

+ (CGSize)selfSizeWithString:(NSString *)string MaxSize:(CGSize)maxSize FontSize:(NSInteger)fontsize LineSpace:(CGFloat)lineSpace

{

    ///排版字符串格式

    NSStringDrawingOptions options =NSStringDrawingUsesLineFragmentOrigin |NSStringDrawingUsesFontLeading;

    ///段落换行模式

    NSMutableParagraphStyle* style = [[NSMutableParagraphStylealloc] init];

    [style setLineSpacing:lineSpace];

    [style setLineBreakMode:NSLineBreakByWordWrapping];

    ///字体

    UIFont* font = [UIFontsystemFontOfSize:fontsize];

    //封装属性

    NSDictionary* attributes =@{NSFontAttributeName:font,NSParagraphStyleAttributeName:style};

    //调用方法

    CGRect rect = [stringboundingRectWithSize:maxSizeoptions:options attributes:attributescontext:nil];

    return rect.size;

}

最后,不管是什么只要是多行,都不要忘记设置 label . numberOfLines = 0 这,和另外在设置一次 label . lineBreakMode = NSLineBreakByWordWrapping ; 这个属性,如果不设置的话末尾是有点点点省略号的,因为一个是对字串设置,一个是针对label我是这样理解的。

5、sizeToFit来自适应label高度

在使用了多次比较麻烦的自适应高度后我遇到sizetofit,这个系统会帮你根据文字大小和label的宽度自适应高度,竖直方向默认是靠上对齐的,最终系统设置的label高度是去除所有不必要的高度,因为这是根据内容文字长度和字号设置的
效果:

注意:sizetofit会自动忽略掉强制末尾输入的回车:“\n”

但是系统去除了行间距,如果想要行之间没那么紧凑需要再设置行高

效果:

6、获取label中行数

    //得到最佳自适应size

    CGSizesize = [self.nextLabelsizeThatFits:CGSizeMake(nextSize.width,CGFLOAT_MAX)];

    //得到最佳自适应高度

    CGFloatlabelHeight = [self.nextLabelsizeThatFits:CGSizeMake(nextSize.width,CGFLOAT_MAX)].height;

    //对应字号所占的高度

    CGFloat lineHeightself.nextLabel.font.lineHeight;

    // 行数

    CGFloat labelHeight = [self.nextLabel sizeThatFits:CGSizeMake(self.nextLabel.frame.size.widthMAXFLOAT)].height;

    NSNumber *count = @((labelHeight) / self.nextLabel.font.lineHeight);

向上取整:ceilf() 向下取整:floor()

注1:这里的 MAXFLOAT < CGFLOAT_MAX


注2:通过我本人上面的方法+ (CGSize)selfSizeWithString:(NSString *)string MaxSize:(CGSize)maxSize FontSize:(NSInteger)fontsize LineSpace:(CGFloat)lineSpace 计算得到的行高,通过系统方法:sizeThatFits获取得到的行高完全相等。

6、设置label的行间距

NSString *labelText = [NSString stringWithFormat:@"%@", [infoDic objectForKey:@"value"]];

    // 行数

    CGFloat labelHeight = [self.nextLabelsizeThatFits:CGSizeMake(self.nextLabel.frame.size.width,MAXFLOAT)].height;

    NSInteger count = labelHeight / self.nextLabel.font.lineHeight;


    if (count > 1) {

        ///多余1行调整行间距

        NSMutableAttributedString *attributedString = [[NSMutableAttributedStringalloc]initWithString:labelText];

        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStylealloc]init];

        

        [paragraphStyle setLineSpacing:13];//调整行间距

        

        [attributedString addAttribute:NSParagraphStyleAttributeNamevalue:paragraphStylerange:NSMakeRange(0, [labelTextlength])];

        self.nextLabel.attributedText = attributedString;

    }

    [self.nextLabelsizeToFit];


效果就是上面的截图,可根据情况自行设置,有不对的地方欢迎吐槽指出。^_^


猜你喜欢

转载自blog.csdn.net/xinxinNoGiveUp/article/details/50495551