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

最新处理程序员

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

messageTitle.lineBreakMode = NSLineBreakByCharWrapping;

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




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

5293487-a397c031cf95df90.png
Snip20170719_100.png

同事问个人解决办法,我说这个怼回去啊,能不动代码就不动代码呀,因而我找了个微信的状况做为怼的资本,截图以下:3d

5293487-f447ddb5c1067b94.png
Snip20170719_102.png

可是过了一下子同事说没办法拗不过产品经理,好吧,那只能怼代码了,如今的程序员说话份量愈来愈轻了(敲黑板!!!若是有来生,绝对不作程序猿!!!)code

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

思路blog

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

这个时候咱们须要知道两个长度:ci

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

经过一段文字的长度与Label的长度进行比较就能够得出特定的位置,可是这只是两行,那若是有不少行呢?咱们须要作一下迭代便可。

另外考虑到咱们一句话解决全部问题的思想,因此咱们须要建立一个UILabel的分类来设置数字分段。

代码

首先建立分类UILabel+SetNewLineText,代码以下:

//UILabel+SetNewLineText.h

#import <UIKit/UIKit.h>

@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 <objc/message.h>

#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

说明几个变量:

5293487-ffe4ab4ce12da9da.png
Snip20170719_104.png

PS: 这15*2是由于个人Label作约束的时候距离左边和右边都是15公分,因此须要减掉这部分

5293487-e7e8ece6c6034085.png
Snip20170719_105.png

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

5293487-11ee0d88fd77e571.png
Snip20170719_107.png

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

5293487-d75c2c4f54f0a475.png
Snip20170719_108.png

调用:

5293487-3c2572bd3111231f.png
Snip20170719_109.png
5293487-8ae39ee4c5c207b9.png
Snip20170719_114.png

多行:

5293487-4c97a7607074d017.png
Snip20170719_111.png
5293487-6a471b9ab7f38095.png
Snip20170719_113.png

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

5293487-f67e4e40d2c1807f.gif
逗比.gif