iOS开发之处理数字过长自动换行问题

最新处理

关于以下问题,已经有了最新的处理方式,一句代码就可以搞定,解决办法如下:

messageTitle.lineBreakMode = NSLineBreakByCharWrapping;

平时不太关注Label的其他属性,所以也就没有往那方面想,以后会多关注,在此感谢评论区的大神指教...




过期处理
今天同事问我一个问题就是UILabel上数字过长直接下一行导致后面留白怎么处理,具体问题如下:

iOS开发之处理数字过长自动换行问题_第1张图片
Snip20170719_100.png

同事问我的解决办法,我说这个怼回去啊,能不动代码就不动代码呀,于是我找了个微信的情况作为怼的资本,截图如下:

iOS开发之处理数字过长自动换行问题_第2张图片
Snip20170719_102.png

但是过了一会儿同事说没办法拗不过产品经理,好吧,那只能怼代码了,现在的程序员说话分量越来越轻了(敲黑板!!!如果有来生,绝对不做程序猿!!!)

那么要怼代码,该怎么怼呢?

思路

首先我需要将一段文字,先以两行来说,那么如果靠近Label末端是一段数字的话那么铁定会换行出现上面截图的情况,但是我试过了只要不是一段完整的数字就行,也就是说为了不影响内容的美观,我们只需要在特定的位置加上空格或者换行符就行了。那怎么精准的算出特定位置呢?

这个时候我们需要知道两个长度:

  • Lable的长度
  • 一段文字的长度

通过一段文字的长度与Label的长度进行比较就可以得出特定的位置,但是这只是两行,那如果有很多行呢?我们需要做一下迭代即可。

另外考虑到我们一句话解决所有问题的思想,所以我们需要创建一个UILabel的分类来设置数字分段。

代码

首先创建分类UILabel+SetNewLineText,代码如下:

//UILabel+SetNewLineText.h

#import 

@interface UILabel (SetNewLineText)

//数字分段Text
@property(nonatomic, copy) NSString *newLineText;
//存储文字的
@property(nonatomic, copy) NSMutableString *mStr;

@end

//UILabel+SetNewLineText.m

//
//  UILabel+SetTheContentToNewLine.m
//  testDeom
//
//  Created by KODIE on 2017/7/19.
//  Copyright © 2017年 admin. All rights reserved.
//

#import "UILabel+SetNewLineText.h"
#import 

#define kLabelWidth ([UIScreen mainScreen].bounds.size.width - 15 * 2)
#define kTextSize 17

@implementation UILabel (SetNewLineText)

- (void)setMStr:(NSMutableString *)mStr{
    objc_setAssociatedObject(self, "mStr", mStr, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSMutableString *)mStr{
    return objc_getAssociatedObject(self, "mStr");
}

- (void)setNewLineText:(NSString *)text{
    CGFloat textWidth = [self widthWithText:text];
    if (textWidth < kLabelWidth) {
        self.text = text;
        return;
    }
    
    for (NSInteger i = 0; i < text.length; i++) {
        NSString *subStringFor = [text substringToIndex:i];
        NSString *subStringBeh = [text substringToIndex:i+1];
        NSString *subStringOth = [text substringFromIndex:i];
        CGFloat textWidthFor   = [self widthWithText:subStringFor];
        CGFloat textWidthBeh   = [self widthWithText:subStringBeh];
        CGFloat textWidthOth   = [self widthWithText:subStringOth];
        
        if (textWidthFor <= kLabelWidth && textWidthBeh > kLabelWidth) {
            if (self.mStr == nil) {
                NSString *string = @"";
                [self setMStr:string.copy];
            }
            if(textWidthOth > kLabelWidth){
                NSString *newString = [NSString stringWithFormat:@"%@ ",subStringFor];
                NSString *string = [NSString stringWithFormat:@"%@%@",self.mStr, newString];
                [self setMStr:string.copy];
                //[self.mStr appendString:newString];
                [self setNewLineText:subStringOth];
            }else{
                NSString *newString = [NSString stringWithFormat:@"%@ %@",subStringFor,subStringOth];
                NSString *string = [NSString stringWithFormat:@"%@%@",self.mStr, newString];
                [self setMStr:string.copy];
                //[self.mStr appendString:newString];
            }
        }
    }
    self.text = self.mStr.copy;
}

- (NSString *)newLineText{
    return self.text;
}

#pragma mark - private function
- (CGFloat)widthWithText:(NSString*)text {
    
    CGSize size = [text sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:kTextSize]}];
    return size.width;
}

@end

说明几个变量:

Snip20170719_104.png

PS: 这15*2是因为我的Label做约束的时候距离左边和右边都是15公分,所以需要减掉这部分

Snip20170719_105.png

PS: 这个指的是文字的size,我是xib上定的,截图如下:

Snip20170719_107.png

只要把这些两个参数给改了就能适应你自己的场景了,调用如下:
导入头文件:

iOS开发之处理数字过长自动换行问题_第3张图片
Snip20170719_108.png

调用:

iOS开发之处理数字过长自动换行问题_第4张图片
Snip20170719_109.png
iOS开发之处理数字过长自动换行问题_第5张图片
Snip20170719_114.png

多行:

iOS开发之处理数字过长自动换行问题_第6张图片
Snip20170719_111.png
iOS开发之处理数字过长自动换行问题_第7张图片
Snip20170719_113.png

如有疑问或者更好的方式或者办法请评论提出,感谢各位看官,以上!!!

逗比.gif

你可能感兴趣的:(iOS开发之处理数字过长自动换行问题)