#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