iOS開發(fā)之 storyboard自動布局

一.自動布局基礎知識

  • VFL:Visual Format Language 可視化格式語言
    H:水平方向
    V:水平方向
    | 表示父視圖
  • 本身表示一段距離: -
  • 表示指定距離: -距離-
    注意:使用自動布局步驟:
    1.使用自動布局(autolayout) frame就會失效字管,就不需要再去設置視圖的frame
    使用代碼自動布局 需要禁用這個屬性:
    translatesAutoresizingMaskIntoConstraints = NO
    2.綁定視圖與字符串
    3.添加約束
  • 可視化語言編譯
    可視化語言:
    H:|-100-[view(>=100)]-100-|
    V:|-150-[view(40)]
    編譯:
    橫向:距離父視圖左側(cè)100 視圖本身的寬度最小是100 距離父視圖右側(cè)是100
    豎向:距離父視圖頂部150 視圖本身的高度是40
  • 常見的兩個錯誤:
    1.Unable to parse constraint format: Expected a view or '|' 丟了豎杠谷暮。
    2.'Unable to parse constraint format: Unable to interpret '|' character, because the related view doesn't have a superview 在布局后把View放在父視圖上就會報這個錯 要初始化view時 就把它放在父視圖上。

二.具體實例解析 自動布局

1.先用一個簡單的例子來說明(可以全部寫在ViewDidLoad中)
UIView *view = [[UIView alloc]init];
view.backgroundColor = [UIColor greenColor];
[self.view addSubview:view];

        //    1.禁用屬性
        view.translatesAutoresizingMaskIntoConstraints = NO;
        //    2.綁定視圖和字符串
        NSDictionary *views = NSDictionaryOfVariableBindings(view);
        //    3.添加約束

        /*
         第一個參數(shù):VFL語句
         第二個參數(shù):options 基于哪一個選項 (基于哪個方向去計算布局)
         第三個參數(shù):metrics:綁定數(shù)值(NSNumber)與字符串
         第四個參數(shù):綁定視圖 與字符串
         */
        [self.view addConstraints:[NSLayoutConstraint  constraintsWithVisualFormat:@"H:|-20-[view(>=100)]-20-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:views]];
        [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[view(40)]" options:NSLayoutFormatAlignAllLeft metrics:nil views:views]];

2.下面用一個比較復雜的例子來剖析自動布局(在viewDidLoad中調(diào)用loadDemo這個方法即可)
- (void)loadDemo{
// 1 創(chuàng)建三個視圖 紅/綠/藍/黃/橙色視圖
// 紅
UIView *redView = [self alive];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
// 綠
UIView *greenView = [self alive];
greenView.backgroundColor = [UIColor greenColor];
[self.view addSubview:greenView];
// 藍
UIView *blueView = [self alive];
blueView.backgroundColor = [UIColor blueColor];
[self.view addSubview:blueView];
// 黃
UIView *yellowView = [self alive];
yellowView.backgroundColor = [UIColor yellowColor];
[self.view addSubview:yellowView];
// 橙
UIView *orangeView = [self alive];
orangeView.backgroundColor = [UIColor orangeColor];
[self.view addSubview:orangeView];

        [self.view addConstraints:[self portraitConstraints:redView :greenView :blueView yellowView:yellowView orangeView:orangeView]];

    }

    // 這樣寫完全是為了代碼的方便使用,創(chuàng)建對象的同時初始化控件
    - (UIView *)alive
    {
        UIView *newView = [UIView new];
        newView.translatesAutoresizingMaskIntoConstraints = NO;
        return newView;
    }


     - (NSMutableArray *) portraitConstraints:(UIView *)redView :(UIView *)greenView :(UIView *)blueView yellowView:(UIView *)yellowView orangeView:(UIView *)orangeView{
        NSMutableArray *array = [NSMutableArray array];
        // 注1:紅色視圖的寬度大于等于10 小于30    黃色視圖的寬度大于40 小于120  水平
        [array addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[redView(>=10,<=30)]-20-[greenView(>=40,<=120)]-20-[yellowView]-20-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(redView, greenView, yellowView)]];
        // 注2:垂直方向 red高度V:100<= <=160  藍色 V:30<= <=60  橙色待定
        [array addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-70-[redView(>=100,<=160)]-20-[blueView(>=30,<=60)]-[orangeView]-20-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(redView, blueView, orangeView)]];


        // 和注2類似
        [array addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-70-[greenView(>=100,<=160)]-20-[blueView(>=30,<=60)]-[orangeView]-20-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(greenView, blueView, orangeView)]];
    // 和注2類似   或許有人會問 為什么得添加黃色和綠色横辆,原因很簡單,就是為了滿足各個約束谨履,避免造成約束不足
        [array addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-70-[yellowView(>=100,<=160)]-20-[blueView(>=30,<=60)]-[orangeView]-20-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(yellowView, blueView, orangeView )]];


        // 注3:控制blued的寬度
        [array addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[blueView]-120-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(blueView)]];

        // 注4:為橙色高度添加約束條件
        [array addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[blueView]-20-[orangeView(>=blueView)]-20-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(blueView, orangeView)]];

        // 注4:為橙色添加寬度約束條件
        [array addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[orangeView]-20-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(blueView, orangeView)]];


        return array;
    }
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吠式,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子些椒,更是在濱河造成了極大的恐慌,老刑警劉巖掸刊,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件免糕,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機说墨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門骏全,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尼斧,你說我怎么就攤上這事姜贡。” “怎么了棺棵?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵楼咳,是天一觀的道長。 經(jīng)常有香客問我烛恤,道長母怜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任缚柏,我火速辦了婚禮苹熏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘币喧。我一直安慰自己轨域,他們只是感情好,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布杀餐。 她就那樣靜靜地躺著干发,像睡著了一般。 火紅的嫁衣襯著肌膚如雪史翘。 梳的紋絲不亂的頭發(fā)上枉长,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機與錄音琼讽,去河邊找鬼必峰。 笑死,一個胖子當著我的面吹牛跨琳,可吹牛的內(nèi)容都是我干的自点。 我是一名探鬼主播桐罕,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼脉让,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了功炮?” 一聲冷哼從身側(cè)響起溅潜,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薪伏,沒想到半個月后滚澜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡嫁怀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年设捐,在試婚紗的時候發(fā)現(xiàn)自己被綠了借浊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡萝招,死狀恐怖蚂斤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情槐沼,我是刑警寧澤曙蒸,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站岗钩,受9級特大地震影響纽窟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兼吓,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一臂港、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧视搏,春花似錦趋艘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棚愤,卻和暖如春搓萧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宛畦。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工瘸洛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人次和。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓反肋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親踏施。 傳聞我的和親對象是個殘疾皇子石蔗,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容