ios新手開發——Label分散對齊與UIView高度測量
阿新 • • 發佈:2019-02-16
最近為了實現公司的一個動態排版模式(如圖:),可謂是把IOS動態佈局運用到了極致.尤其是對label的運用.才開始接觸ios開發的時候覺得label並不能像安卓一樣那麼智慧,因為ios中控制元件的位置都是絕對的,在不用任何第三方或者autolayout佈局的情況下很不容易做到自適應展示一些高度不一的控制元件.在此博主本著"先百度,後造輪"的心態,自己封裝了一些常用的獲取view自適應高度的方法:
先申明幾個巨集定義,方便減少我們的程式碼量
#define VH(X) X.frame.size.height #define VW(X) X.frame.size.width #define VX(X) X.frame.origin.x #define VY(X) X.frame.origin.y #define VF(v,x,y,w,h) v.frame=CGRectMake(x, y, w, h);
UIlabel自適應高度實現
/*
* label高度自適應,呼叫前需設定文字和字型大小
*/
+(CGFloat)getlabelHeightWithLabel:(UILabel*)lab{
[lab sizeToFit];
lab.numberOfLines = 0;
lab.lineBreakMode = NSLineBreakByWordWrapping;
CGSize size = [lab sizeThatFits:CGSizeMake(VW(lab), MAXFLOAT)];
if([lab.text isEqualToString:@""]){
size.height=VH(lab);
}
return size.height;
}
方法很簡單,傳入一個已經設定好text的label物件,然後通過設定一些換行屬性,從而呼叫sizeThatFits方法返回自適應的高度,注意在使用該方法前必須設定label的字型和文字~
UIlabel單行文字分散對齊:
/*
* 文字分散對齊
*/
+(NSMutableAttributedString*)fillWords:(NSString*)str andWidth:(CGFloat)width andFont:(UIFont*)font{
NSMutableAttributedString* attrStr = [[NSMutableAttributedString alloc] initWithString:str];
if(str.length==0||str.length==1){
return attrStr;
}
UILabel * lab=[[UILabel alloc]init];
lab.font=font;
lab.attributedText=attrStr;
[lab sizeToFit];
CGFloat offsetWidth;
offsetWidth=(width-VW(lab))/(str.length-1);
[attrStr addAttribute:NSKernAttributeName value:@(offsetWidth) range:NSMakeRange(0, attrStr.length-1)];
return attrStr;
}
引數有三個,分別為:文字、預設寬度和字型.要實現單行分散對齊,原理很簡單,我們先給label一個預設的顯示寬度,然後自適應測量出文字的寬度,然後用總寬度/文字寬度就可以得到每個字之間的間距,通過設定字間距從而實現分散對齊.
UIView自適應子檢視後要顯示的高度
/*
* 獲取view的子view高度和
*/
+(CGFloat)getHeightOfView:(UIView *)view{
CGFloat height=VY(view)+VH(view);
if([view subviews].count!=0){
UIView * childView=[view subviews][[view subviews].count-1];
height=VY(childView)+VH(childView);
if([view subviews].count>=2){
CGFloat cHeight;
UIView * secondView=[view subviews][[view subviews].count-2];
cHeight=VY(secondView)+VH(secondView);
if(cHeight>height){
return cHeight;
}
}
}
return height;
}
該方法主要是先獲取view的最後一個子View,然後通過比較最後一個子View的高度和倒數第二個子View的高度,從而返回最大的高度.這樣就實現了uiview自適應高度的計算.
總結
有了這三個方法,再實現上面說的效果就很簡單了,只需要用for迴圈就可以輕鬆解決,在此就不貼上程式碼了.至於顏色標紅方法很多,在此就不贅述.其實IOS動態佈局開發相對於安卓來說,並不佔有優勢,但是通過各方面的資料也可以進行彌補,在此,對IOS中label的應用更深入了一些.不知不覺ios已經做了快四個月,對於安卓可謂已經被打入後宮,這個階段結束,也會把精力放在安卓身上,期待我下一篇仿iosQQ下拉重新整理的讀者們,請自行加關注喲~
作者:yangpeixing
QQ:313930500
轉載請註明出處~謝謝~