1. 程式人生 > >ios新手開發——Label分散對齊與UIView高度測量

ios新手開發——Label分散對齊與UIView高度測量

最近為了實現公司的一個動態排版模式(如圖:),可謂是把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

轉載請註明出處~謝謝~