问题描述:
最近使用给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。