最新處理程序員
關於如下問題,已經有了最新的處理方式,一句代碼就能夠搞定,解決辦法以下:微信
messageTitle.lineBreakMode = NSLineBreakByCharWrapping;
平時不太關注Label的其餘屬性,因此也就沒有往那方面想,之後會多關注,在此感謝評論區的大神指教...app
過時處理
今天同事問我一個問題就是UILabel上數字過長直接下一行致使後面留白怎麼處理,具體問題以下:atom
同事問個人解決辦法,我說這個懟回去啊,能不動代碼就不動代碼呀,因而我找了個微信的狀況做爲懟的資本,截圖以下:3d
可是過了一下子同事說沒辦法拗不過產品經理,好吧,那隻能懟代碼了,如今的程序員說話份量愈來愈輕了(敲黑板!!!若是有來生,絕對不作程序猿!!!)code
那麼要懟代碼,該怎麼懟呢?orm
思路blog
首先我須要將一段文字,先以兩行來講,那麼若是靠近Label末端是一段數字的話那麼鐵定會換行出現上面截圖的狀況,可是我試過了只要不是一段完整的數字就行,也就是說爲了避免影響內容的美觀,咱們只須要在特定的位置加上空格或者換行符就好了。那怎麼精準的算出特定位置呢?ip
這個時候咱們須要知道兩個長度:ci
經過一段文字的長度與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
說明幾個變量:
PS: 這15*2是由於個人Label作約束的時候距離左邊和右邊都是15公分,因此須要減掉這部分
PS: 這個指的是文字的size,我是xib上定的,截圖以下:
只要把這些兩個參數給改了就能適應你本身的場景了,調用以下:
導入頭文件:
調用:
多行:
若有疑問或者更好的方式或者辦法請評論提出,感謝各位看官,以上!!!