最近開始工作,也就接觸學習到更多,寫日記的時候,也就把這些記一記
Masonry
在項目中出現的問題: iOS8,iOS9上,如果你限制的條件沒有寫好,那估計很難發現你自己寫少了一個半個限制,因為可能兼容性比較好吧,但是如果在iOS7上的話,少則畫面出乎你的意料,多則......讓你糾結半天都找不出bug的問題,多半就是出在這些地方。可能因為你的view在沒有addsubview之前添加了。有時候或許你以為自己邏輯判斷已經加了,但是或許在跟服務器請求跟頁面生成是異步的情況下并沒有加上,導致程序崩潰。
還有就是,如果你在xib中加了限制,但是你想自己另外在邏輯判斷后更新限制。如果你發現為什么自己的限制沒有加錯,但是改了半天看了半天限制的代碼,布局還是沒有改變啊!這個我估計就是因為你在xib中用到布局的內容跟你更新的限制內容不一樣。例如:你在xib中使用left,right作為限制條件的話,你如果想用center去更新view的布局,我很遺憾,那會沒有效果,無論是mas_makeConstraints ,還是mas_makeConstraints,但是當我第三次編寫這個文章的時候讓我發現了有mas_remakeConstraints這個方法!
自己寫總結的時候,都需要重新開一下別人的blog,感覺這樣的比較完整。Massory實用的block語法,因此一個weak self就顯得有備無患。
#define WS(weakSelf) __weak __typeof(&*self)weakSelf = self;
UIView *sv = [UIView new];
[sv showPlaceHolder];
sv.backgroundColor = [UIColor blackColor];
[self.view addSubview:sv];
[sv mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(ws.view);
make.size.mas_equalTo(CGSizeMake(300, 300));
}];
為一個view對象添加一個autolayout只需要一個block語句的調用。
但是需要注意的是:
- 自己添加的限制需要做到真的可以完全定住這個view,不然就可能你在這個設備系統上運行沒問題,但是換了個設備效果就不出來了,那么問題就是出在你設的限制沒有能固定這個view。
- 還有一個注意的地方就是,你需要先addsubview然后才能設定這個view的autolayout。
項目中,我在xib設置了限制,但是在服務器請求之后需要對布局進行修改,這時我還是用了mas_makeConstraints這個方法,現在看來是有問題的。
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block;
- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block;
- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker make))block;
/
mas_makeConstraints 只負責新增約束 Autolayout不能同時存在兩條針對于同一對象的約束 否則會報錯
mas_updateConstraints 針對上面的情況 會更新在block中出現的約束 不會導致出現兩個相同約束的情況
mas_remakeConstraints 則會清除之前的所有約束 僅保留最新的約束
三種函數善加利用 就可以應對各種情況了
*/
一些高級使用git源碼也有介紹,我這里再貼一個介紹的比價好的blog
Masonry介紹與使用實踐:快速上手Autolayout
####### 之前還看過使用autolayout優先級這個東西,也沒試過masonry里面怎么樣,以后有空用到或者想到的時候再補補。
有趣的Autolayout實現
#NSArray遍歷的那些事
有些時候,需要遍歷一個數組,有些時候需要反向遍歷一個數組,有些時候需要在數組里面找一個數字,但是有些時候需要找一個對象,在C語言中,如果比較兩個值或者兩個指針所指向的內容,比較的方法很簡單代碼也很少,但是如果指針所指向的是結構體,那就需要對結構體內的參數進行一一的比較。
可變與不可變數組
可變與不可變之間,就是一個不可以修改的條件嘛。那你就錯了,可變與不可變數組之間還有一個深復制與淺復制的差別,現在我也忘記區別了,有空回頭補。
//言歸正傳,遍歷。
NSArray arr;
if (id objecet in arr)
{
if (id == something_){
}
}
一般情況下我們都會這么用,前幾天我看hit-testing的時候,看到了一個反向遍歷的函數,但是其實也是將array取反然后再遍歷罷了
//取反函數:只需要把判斷式子改一下
if (id object in [arr reverseObjectEnumerator]){
}
但是還有一種情況,就是當你需要對一個