問題描述:
最近使用給Flutter團隊寫view組件的時候,出現了觸發Widget的頻繁build的問題。
問題排查:
Flutter的同事提到在flutter層,是因為 updateViewportMetrics 這個函數的頻繁觸發調用。
在iOS代碼中查到,主要是因為 viewDidLayoutSubviews 這個生命周期函數的頻繁觸發調用。
首先,知道viewDidLayoutSubviews的觸發原理,其中有一條是有sub view的frame更改。
排查代碼,代碼中並沒有頻繁更改frame或者布局約束的操作。
但是,有label控件的顯示是動態的,通過調試發現這個label的translatesAutoresizingMaskIntoConstraints屬性設置為NO的時候,會觸發這個問題。
問題解決:
設置如下,默認為Automatic, 修改為 Translates Mask Into Constraints. 即可解決這個問題,
問題解釋:
關於translatesAutoresizingMaskIntoConstraints 原理不做解釋。
當設置為Automatic時,即translatesAutoresizingMaskIntoConstraints = YES. 將使用自動布局,這個時候如果動態的更改label的文字顯示,會觸發布局,相當於會自動更改frame,進而會觸發所在controller的viewWillLayoutSubviews和viewDidLayoutSubviews。