layout用法
It’s important to optimize any UIView layoutSubviews method you create, as it can be frequently called, and has the potential for creating recursion (triggering a setNeedsLayout from layoutSubviews can create a loop that will grossly affect your apps performance). Layout subviews is called once per run loop on any view that has had setNeedsLayout or setNeedsDisplayWithRect: called on it. So in addition to any time you manually call these methods, it can be useful to know when the UI framework calls setNeedsLayout/setNeedsDisplay as this will trigger layoutSubviews.
For this purpose, I will define a few view relationships:
- View1 – UIView class, root view for examples
- View1.1 – UIScrollView class, subview of View1
- View1.1.1 – UIView class, subview of View1.1 (No autoresize mask)
- View1.1.2 – UIView class, another subview of View1.1 (Autoresize mask – flexible width)
I then ran the following tests. An X means the view was layed out
From this I surmise the following:
- init does not cause layoutSubviews to be called (duh)
- init 方法不會調用layoutSubviews
- addSubview causes layoutSubviews to be called on the view being added, the view it’s being added to (target view), and all the subviews of the target view
- addSubview會調用 subview窗體,subview父窗體,和subview窗體下的所有子窗體 中的layoutSubviews
- setFrame intelligently calls layoutSubviews on the view having it’s frame set only if the size parameter of the frame is different
- setFrame中的參數變化的時候會調用layoutSubviews
- scrolling a UIScrollView causes layoutSubviews to be called on the scrollView, and it’s superview
- 滾動UIScrollView會調用 scrollview,scrillview的父窗體 的layoutSubviews方法
- rotating a device only calls layoutSubview on the parent view (the responding viewControllers primary view)
-
旋轉設備時候在 父窗體 會被調用
- removeFromSuperview – layoutSubviews is called on superview only (not show in table)
Hopefully this is helpful information for you as well.
1 comment:
I find that resizing
(not moving, only resizing) any subview causes the superview to get -layoutSubviews sent to it, which I found unexpected. From your table it doesn’t look like you tested that case.