There are lots of viewDidLayoutSubviews events fired in my ViewController. Eventually I narrowed down to the single line of code which triggers the event:
self.debugLabel.text = [NSString stringWithFormat:@"%@ - %@", key, [@(tag) stringValue]];
Its a UILabel in a subview added to self.view of the ViewController. Why changing the text of a UILabel will cause boundary changes? In viewDidLayoutSubviews doc:
When the bounds change for a view controller's view, the view adjusts the positions of its subviews and then the system calls this method.
p.s. I am sure the debugLabel font size is small enough to fit in its frame.