1. 程式人生 > >Auto Layout效能?那試一下簡便的Frame寫法。

Auto Layout效能?那試一下簡便的Frame寫法。

之前一直採用的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快取,非同步計算等優化。還有一個 最關鍵的問題動畫。