首页 > 代码库 > 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属性失效问题