#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。

 

posted @ 2019-10-09 10:40  u-zoro  阅读(2123)  评论(0编辑  收藏  举报