亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS自動布局進階用法

2019-11-14 19:35:35
字體:
來源:轉載
供稿:網友

本文主要介紹幾個我遇到并總結的相對高級的用法(當然啦牛人會覺得這也不算什么)。 簡單的storyboard中上下左右約束,固定寬高啥的用法在這里就不做贅述了。

autolayout自動布局是iOS6以后出現的,但是在開始的一段時間里大家并不怎么會用,都是一上來先勾掉。之后隨著5s,iphone6的出現屏幕多種多樣。用多層if來判斷尺寸已經完全hold不住了才開始學習自動布局。

在這之前有個叫自動伸縮的autoresizing屬性,這個主要用于一個控件和自己父控件之間的關系。只有autolayout才真正可以在任意兩個控件中建立關系。

 如果你不是在董鉑然博客園看到本文 請點擊查看原文

關于autoresizing

autoresizing需要注意的是 storyboard中設置的約束和手碼中設置的約束是相反的。 storyboard圖形頁面里點的右邊的線和下邊的線的意思是“固定”

而手碼中常用的autoresizingMasks屬性中的枚舉都是Flexible可“伸縮”的。 所以假如想要讓右邊和下邊的距離固定,在代碼中應該設置左邊和上邊的可伸縮約束。

yellowView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin |UIViewAutoresizingFlexibleTopMargin;

有了autolayout之后這個自動伸縮很少用了 一共七個屬性。

無,寬可伸縮,高可伸縮,左間距可伸縮,右間距可伸縮,上間距可伸縮,下間距可伸縮

     UIViewAutoresizingNone                 = 0,

     UIViewAutoresizingFlexibleWidth        = 1 << 1,

     UIViewAutoresizingFlexibleHeight       = 1 << 4,

     UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,

     UIViewAutoresizingFlexibleRightMargin  = 1 << 2,

     UIViewAutoresizingFlexibleTopMargin    = 1 << 3,

     UIViewAutoresizingFlexibleBottomMargin = 1 << 5

 每個枚舉值都是位移枚舉,可以在一行代碼中傳多個值。

 

關于label的自動識別大小

label想要在界面中顯示成這樣

意義是下面的控件可以根據上面label的底部進行自動調整。 

這個不是用sizetofit設置的,而是用約束,會在程序運行中數據變了約束立即改變,尺寸也立即改變。

這種設計方法是:

1.設置label的左邊和上邊的約束,然后再設置下最寬度約束假設是150,把label里面的lines屬性設置成0即隨意任意多行。 這樣里面的文字就會自動換行并且一直顯示完,label的背景色也是自動匹配。

2.但是右邊還多出了一塊。label的右邊還有一塊藍色并不是緊緊的挨著。這時就要選中那個寬度的約束 再到右邊把Relation由原本的equal改成 less than or Equal 。這時候左邊的約束顯示變了  變成≤了。

運行之后結果是:這里可以清楚的看到label的右邊緊緊挨著邊了。

3.但是有時候數據可能為空,一旦為空label的大小就被擠沒有了,下面的控件也凌亂了。所以為了保證就算數據沒有空當也要留著占位,就找給他設置兩個高度約束,一個是大于等于一個是小于等于,包裹成一個范圍。 這時候要把上面width的小于等于改成equal。

就像這樣 這時候運行效果 遇到大量文字和沒文字的兩種效果是

起到了占位的作用。即使文字沒有地方還在。

 

關于Constraints在哪找的問題

左邊的圖constraints有的在label節點下有的在View節點下,究竟是什么原因決定了constraints在哪個節點下面?

是看這個約束是否依賴了別的控件,如果就是自己設置固定寬高啥的不關系到別人那就是在自己下面。如果依賴誰設置了間距,那這個約束就會放在自己和依賴的控件的最小公共父控件下。

如圖   

 

 

關于手碼編寫autolayout約束

storyboard界面里面的托拉拽固然方便但是不能批量操作(董鉑然原創),假如有類似的30個小控件,storyboard就太麻煩了,手碼的話一個循環就完事了

手碼創建就是所謂的那七個參數的長的像句子似得方法

之后再在相應的節點下添加約束,有添加一個和添加一組 兩種方法。

// 高度約束(添加到yellowView身上)    NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:yellowView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0 constant:50];    [yellowView addConstraint:heightConstraint];        // 間距約束(添加到self.view身上)    CGFloat margin = 20;    [self.view addConstraints:@[                                // 左邊                                [NSLayoutConstraint constraintWithItem:yellowView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:margin],                                                                // 右邊                                [NSLayoutConstraint constraintWithItem:yellowView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1.0 constant: - margin],                                                                // 底部                                [NSLayoutConstraint constraintWithItem:yellowView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0 constant: - margin]                                ]];}

  

這里用到了一個核心公式,任何兩個控件間的約束都可以通過這個公式算出

obj1.PRoperty1 =(obj2.property2 * multiplier)+ constant value

multiplier和constant 就是向量系數和偏移量

還有為了避免和系統生成的自動伸縮的約束不沖突 一般加上這句

系統默認這個屬性是yes

 

 

關于VFL語言 

Visual Format Language,翻譯過來是“可視化格式語言”  是蘋果公司為了簡化Autolayout的編碼而推出的抽象語言
相當于打出象形文字似得,而且要全在字符串里寫,遇到錯誤比較難調,但是相對來說代碼精簡了不少。
然后在添加約束的時候就會用到系統提供的另外一種方法。
    NSArray *contraints = [NSLayoutConstraint constraintsWithVisualFormat:vfl options:kNilOptions metrics:metrics views:views];

VFL的詳細語法 可以在官方文檔中 搜 “Visual Format” 就能搜到 

上面的方法中傳到的兩個參數metrics 和 views 是兩個字典。(董鉑然原創) 第一個字典metrics是用來告訴系統里面的每一個值對應哪個字母 

第二個字典views是 用來告訴里面的每一個控件對應字符串里的什么

如果整個VFL語言里的所有控件你都是用原名寫在里面的,那可以用宏代替

括號里可以傳多個值逗號隔開

 

關于常用的手碼約束的第三方框架

有 Masonry 和 UIView+Autolayout

框架地址是:

https://github.com/Masonry/Masonry 

https://github.com/smileyborg/UIView-AutoLayout

 

UIView+Autolayout框架

這個相對于masonry,是個輕量級的框架易于上手,里面一共也就兩個文件。也非常好用,都是用auto開頭。適用于約束不經常改變的項目

事例用法:

直接設置四周的間隔距離

[self.yellowView autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsMake(20, 20, 20, 20)]; //直接設置四周的間隔距離

設置三個間隔,然后再添加個高度,

[self.yellowView autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsMake(20, 20, 20, 20)excludingEdge:ALEdgeTop]; // 讓頂部約束無效    [self.yellowView autoSetDimension:ALDimensionHeight toSize:100]; // 自己再添加個高度約束正好四個

也可以直接設置大小

[self.yellowView autoSetDimensionsToSize:CGSizeMake(200, 200)];

總之還有很多用法,在這不一一介紹了,大概就是這個代碼風格。有興趣的可以去上面說的那個github地址上仔細查看。

 

 

Masonry框架

這個框架是重量級的里面好多文件,難于上手,但是用熟練了的話比上面那個牛X,適合于約束要經常改變的項目。
示例代碼:
添加距離四個方向20的間隔約束
[yellowView mas_makeConstraints:^(MASConstraintMaker *make) {        // make代表yellowView        // 添加約束        make.edges.equalTo(self.view).insets(UIEdgeInsetsMake(20, 20, 20, 20));    }];

下面這個是更新約束,非常方便會自動識別上左下右的屬性來更改。

[self.yellowView mas_updateConstraints:^(MASConstraintMaker *make) {        make.left.equalTo(self.view.mas_left).offset(100);        make.top.equalTo(self.view.mas_top).offset(100);        make.right.equalTo(self.view.mas_right).offset(-100);        make.bottom.equalTo(self.view.mas_bottom).offset(-100);    }];

還有一些別的屬性用法。

主要是作者設置的屬性比較多這張圖摘自他的github,有興趣可以去github仔細看

 

關于想給約束改變添加動畫。

因為約束的改變是瞬時操作和frame的概念不一樣,所以把約束的代碼放在動畫的block里是無效的
錯!
正確做法是,把約束寫在外面面,然后在動畫的block中包裹 layoutifneed
對!
 如果你不是在董鉑然博客園看到本文 請點擊查看原文
對了還有一個注意點是:需要依賴父控件的約束要在添加了父控件之后再寫。
有什么不同的看法歡迎評論。本博客所有文章均原創,轉載請注明出處

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人激情在线观看| 国产精品久久久久免费a∨| 久久国产天堂福利天堂| 亚洲人成在线电影| 久久久久久久久91| 国产精品视频久久久久| 欧美高清videos高潮hd| 亚洲欧美日韩天堂一区二区| 国产精品视频一区二区高潮| 欧美精品日韩www.p站| 亚洲乱码国产乱码精品精天堂| 亚洲一区二区三区在线视频| 欧美国产日韩在线| 亚洲激情视频网| 欧美国产第二页| 亚洲免费高清视频| 日韩精品在线观| 国产综合在线观看视频| 亚洲精品www久久久| 亚洲91av视频| 91av在线免费观看| 51色欧美片视频在线观看| 欧美精品18videosex性欧美| 欧美一区视频在线| 亚洲国产精品va在线看黑人| 国产欧美精品一区二区| 97av在线视频免费播放| 亚洲男人第一网站| 亚洲精品一区av在线播放| 亚洲人成电影网站色xx| 日韩精品免费在线视频| 久久亚洲国产精品| 欧美性做爰毛片| 欧美人在线视频| 国产精品永久免费观看| 色综合天天综合网国产成人网| 91久热免费在线视频| 久久久免费精品视频| 欧美影院在线播放| 日韩h在线观看| 国产福利视频一区| 国产精品天天狠天天看| 最近2019中文免费高清视频观看www99| 一区二区三区在线播放欧美| 欧美激情视频三区| 日韩在线观看免费高清完整版| 日韩专区在线观看| 久久中国妇女中文字幕| 奇米一区二区三区四区久久| 亚洲人成77777在线观看网| 亚洲性av网站| 亚洲性视频网站| 亚洲一二三在线| 亚洲日本中文字幕免费在线不卡| 亚洲国产精品成人一区二区| 亚洲欧美日韩第一区| 福利视频一区二区| 精品久久久久久中文字幕| 久久男人av资源网站| 国产日韩av在线播放| 日韩在线观看视频免费| 国产精品亚洲网站| 中文字幕亚洲第一| 98精品国产高清在线xxxx天堂| 欧美一区二区大胆人体摄影专业网站| 成人欧美一区二区三区黑人| 日韩美女福利视频| 亚洲精品国产欧美| 国产精品第3页| 日韩高清电影好看的电视剧电影| 国产欧美精品日韩精品| 日本免费一区二区三区视频观看| 国产精国产精品| 欧美日韩国产成人在线观看| 国产精品扒开腿做爽爽爽男男| 国产精品视频区| 亚洲欧美综合另类中字| 亚洲精品色婷婷福利天堂| 国产精品免费视频xxxx| 国产一区二中文字幕在线看| 成人免费淫片aa视频免费| 欧美成人午夜激情视频| 久久精品视频在线| 国产免费久久av| 亚洲成人久久久久| 韩国精品久久久999| 亚洲欧美日韩天堂一区二区| 亚洲第一网站免费视频| 精品国产一区久久久| 亚洲女同性videos| 欧美日韩人人澡狠狠躁视频| 国产成人高潮免费观看精品| 国产精品国语对白| 久久国产精品久久久久久久久久| 国产精品96久久久久久又黄又硬| 成人国产精品免费视频| 亚洲美女www午夜| 亚洲直播在线一区| 国产免费观看久久黄| 亚洲欧美激情另类校园| 中文字幕日韩欧美在线| 亚洲国产古装精品网站| 亚洲一区二区三区xxx视频| 国产精品久久久久久av下载红粉| 久久久久久久久久久av| 奇米影视亚洲狠狠色| 国产精品视频网址| 国产在线不卡精品| 成人激情春色网| 亚洲成人激情图| 亚洲色图日韩av| 亚洲欧洲成视频免费观看| 亚洲影视九九影院在线观看| 久久av在线看| 久久国产精品影片| 国产成人精品综合| 一区二区日韩精品| 亚洲国产欧美久久| 欧美小视频在线| 国产精品视频1区| 日韩欧美国产高清91| 国产一区二区三区视频在线观看| 国产69精品久久久久9| 久操成人在线视频| 国产成人短视频| 欧美成人免费在线视频| 茄子视频成人在线| 国产精品久久久一区| 久久久久久久影视| 91精品国产乱码久久久久久久久| 国产欧美日韩精品在线观看| 久久综合久中文字幕青草| 国模极品一区二区三区| 国模精品系列视频| 欧美精品福利在线| 日韩欧美999| 欧美国产日韩一区| 欧美第一页在线| 91黑丝高跟在线| 国产亚洲欧美aaaa| 亚洲free嫩bbb| 欧美日韩国产一区中文午夜| 91在线中文字幕| 国产精品欧美久久久| 国内精品视频久久| 1769国产精品| 亚洲国产欧美一区二区三区久久| 国产精品一区二区三区毛片淫片| 欧美做受高潮电影o| 亚洲性视频网址| 精品视频偷偷看在线观看| 色综合91久久精品中文字幕| 久久激情视频免费观看| 亚洲国产精品视频在线观看| 国产亚洲精品久久久| 欧美精品18videos性欧美| 欧美大秀在线观看| 欧美夜福利tv在线| 国产精品入口免费视频一| 亚洲男人av在线| 欧美日韩国产精品一区二区不卡中文| 欧美俄罗斯性视频| 国产91在线高潮白浆在线观看| 欧美一级淫片播放口|