#iOS問題記錄# 頻繁觸發viewDidLayoutSubviews的問題


問題描述:

最近使用給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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM