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