Auto Layout效能?那試一下簡便的Frame寫法。
阿新 • • 發佈:2018-11-07
之前一直採用的Auto Layout,直到有一天寫了一個複雜介面,然後iPhone 6p沒加載出來。。。是的, 沒加載出來。。。
所以我就查閱了一下相關文獻,有一篇《從 Auto Layout 的佈局演算法談效能》比較清晰的解釋了Auto Layout的弊端。
但是呢傳統的Frame為了適配複雜機型,寫起來也非常費勁。所以我嘗試寫一個簡單易用的Frame layout。
先附上我的一個Demo
此Demo只是提出一個初級設想,只是有幾個簡單的用法
例如
因為這是我的一個使用習慣 ,所以我就這麼寫了。
另外我重寫了 layoutSubviews方法,檢視改變的時候,frame會重新計算,不是傳統的那種frame佈局,裡面做了一些計算,當然現在比較初級。
+ (void)load
{
Method origMethod = class_getInstanceMethod([self class], @selector(layoutSubviews));
Method swizMethod = class_getInstanceMethod([self class], @selector(_elLayoutSubViews));
method_exchangeImplementations(origMethod, swizMethod);
}
- (void)elLayout // 所有的寫法都是儲存在ELLayout物件裡面 { ELLayout * l = objc_getAssociatedObject(self, &key_view_tool_layout); if (l) { self.frame = l.frame; } } - (ELLayout *)_layoutFile { ELLayout * l = objc_getAssociatedObject(self, &key_view_tool_layout); if (l == nil) { l = [[ELLayout alloc] initWithView:self]; objc_setAssociatedObject(self, &key_view_tool_layout, l, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } return l; } - (void)_elLayoutSubViews // 這裡是替換的方法,layoutsubviews的時候要計算Frame { [self _elLayoutSubViews]; for (UIView * v in self.subviews) { [v elLayout]; } }
但是這種寫法的程式碼效能具體怎麼樣,我還具體不知道,程式碼公佈出來也是供各位大神指點一下。
如果可行的話,後面會陸續新增一些frame快取,非同步計算等優化。還有一個 最關鍵的問題動畫。