首页 > 代码库 > xib中autoresizingMask属性失效问题
xib中autoresizingMask属性失效问题
在ios的开发中,遇到UIView的排版问题,自然少不了layoutSubviews 这个函数与autoresizingMask这个属性。
在superview的autoresizesSubviews为Yes的时候,会根据subview的autoresizingMask类型进行自动排版,autoresizingMask可选的属性有
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
因为横向和纵向的变换方式是一样的,所以就以iPhone中更常用的纵向变换为例了:
UIViewAutoresizingNone:superview变换时,自己不作变换。
UIViewAutoresizingFlexibleHeight:上边距不变,和superview在高度上变换同等高度。 比如,superview加高100,则自己也加高100。
UIViewAutoresizingFlexibleTopMargin:高度不变。上边距弹性可变,下边距保持不变。
UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleHeight: 这个组合的变换比较绕: 首先,下边距是不变的,但高和上边距会变,变换的计算如下, 比如superview的高度,由100加高的200。自己的下边距是50, 则去掉不变的下边距后,superview的变化比例是:(100-50)/(200-50) = 50/150 = 1/3。 则自己的上边距和高都变为越来的3倍。
UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin : 这个变换的计算就比较简单了,救是自己的上边距,高,下边距都和superview同比变换。 比如superview的高由100变为200。则自己的上边距,高,下边距也都变为原来的2倍。
但对layoutSubviews这个函数何时会被调用却一直不是很清楚,只是知道设置frame的时候,会异步的调用,这里的文章中总结出了几点场景:
- init does not cause layoutSubviews to be called (duh)
- 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
- setFrame intelligently calls layoutSubviews on the view having it’s frame set only if the size parameter of the frame is different
- scrolling a UIScrollView causes layoutSubviews to be called on the scrollView, and it’s superview
- 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)
针对setFrame这一条,曾经以为在layoutSubviews中通过self.frame重新设置一个不同的frme,会再次调用layoutSubviews从而导致死循环,经过实验发现并未产生,还不知道具体的原因。
在如果subview设置了autoresizingMask,而supview中的重写了layoutsubviews,并且其中对subview进行了指定排版,那么subview的autoresizingMask将不会起作用的
xib中autoresizingMask属性失效问题