标签:位置 屏幕 append data- delay size 文档 type offer
列举下iOS layout的相关方法:
layoutSubviews 
layoutIfNeeded 
setNeedsLayout 
setNeedsDisplay 
drawRect 
sizeThatFits 
sizeToFit 
大概经常使用的上面几个 , 详细的应该还有别的。
layoutSubviews 
这种方法,默认没有做不论什么事情,须要子类进行重写 。 系统在非常多时候会去调用这种方法:
1.初始化不会触发layoutSubviews,可是假设设置了不为CGRectZero的frame的时候就会触发。 
2.addSubview会触发layoutSubviews 
3.设置view的Frame会触发layoutSubviews。当然前提是frame的值设置前后发生了变化 
4.滚动一个UIScrollView会触发layoutSubviews 
5.旋转Screen会触发父UIView上的layoutSubviews事件 
6.改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
在苹果的官方文档中强调: You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.layoutSubviews, 当我们在某个类的内部调整子视图位置时,须要调用。反过来的意思就是说:假设你想要在外部设置subviews的位置。就不要重写。 
setNeedsLayout 
标记为须要又一次布局。不马上刷新,但layoutSubviews一定会被调用 
配合layoutIfNeeded马上更新
layoutIfNeeded 
假设,有须要刷新的标记,马上调用layoutSubviews进行布局
这个动画中实用到 举个栗子 。
如图 , 上面有个label ,中间有个button 。 label已经被自己主动布局到左上角 。
然后我们那个left的constraint
@IBOutlet weak var leftContrain:NSLayoutConstraint! 
在viewDidLoad中声明好。然后在Main.storyboard中进行连线。点击button的时候 ,我们把左边的距离改成100 。
在button的点击事件里加上这句。
leftContrain.constant = 100 
然后我们想要一个动画的效果。 
假设这么做
UIView.animateWithDuration(0.8, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: UIViewAnimationOptions.AllowAnimatedContent, animations: { 
                self.leftContrain.constant = 100 
            }, completion: nil) 
你会发现然并卵 。事实上这句话self.leftContrain.constant = 100仅仅是运行了setNeedsLayout 标记了须要又一次布局。可是没有马上运行。所以我们须要在动画中调用这种方法layoutIfNeeded 
所以代码应该这么写
leftContrain.constant = 100 
        UIView.animateWithDuration(0.8, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: UIViewAnimationOptions.AllowAnimatedContent, animations: { 
                self.view.layoutIfNeeded() //马上实现布局 
            }, completion: nil) 
所以上面无论写多少约束的改变。仅仅须要在动画里动用 一次self.view.layoutIfNeeded() ,全部的都会已动画的方式 。假设一些变化不想动画 。在动画前运行self.view.layoutIfNeeded()
drawRect 
这种方法是用来重绘的。
drawRect在下面情况下会被调用: 
1、假设在UIView初始化时没有设置rect大小,将直接导致drawRect不被自己主动调用。
drawRect调用是在Controller->loadView, Controller->viewDidLoad 双方法之后掉用的.所以不用操心在控制器中,这些View的drawRect就開始画了.这样能够在控制器中设置一些值给View(假设这些View draw的时候须要用到某些变量值). 
2、该方法在调用sizeToFit后被调用。所以能够先调用sizeToFit计算出size。然后系统自己主动调用drawRect:方法。3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自己主动调用drawRect:。4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,可是有个前提条件是rect不能为0。以上1,2推荐。而3,4不提倡
drawRect方法使用注意点: 
1、若使用UIView画图。仅仅能在drawRect:方法中获取对应的contextRef并画图。
假设在其它方法中获取将获取到一个invalidate的ref而且不能用于画图。drawRect:方法不能手动显示调用。必须通过调用setNeedsDisplay 或者 setNeedsDisplayInRect,让系统自己主动调该方法。
2、若使用calayer画图,仅仅能在drawInContext: 中(相似于drawRect)绘制。或者在delegate中的对应方法绘制。相同也是调用setNeedDisplay等间接调用以上方法3、若要实时画图,不能使用gestureRecognizer,仅仅能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕
sizeToFit 
sizeToFit会自己主动调用sizeThatFits方法; 
sizeToFit不应该在子类中被重写,应该重写sizeThatFits 
sizeThatFits传入的參数是receiver当前的size,返回一个适合的size 
sizeToFit能够被手动直接调用sizeToFit和sizeThatFits方法都没有递归。对subviews也不负责。仅仅负责自己
文/大石头布(简书作者) 
原文链接:http://www.jianshu.com/p/eb2c4bb4e3f1
标签:位置 屏幕 append data- delay size 文档 type offer
原文地址:http://www.cnblogs.com/lxjshuju/p/7283171.html