iOS之layoutSubView的使用

从百度上搜索了一下layoutSubviews的用处,以下是搜索的结果,当然,笔者是会一一验证的.

1、 init初始化不会触发layoutSubviews

2、 addSubview会触发layoutSubviews

3、 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化

4、 滚动一个UIScrollView会触发layoutSubviews

5、 旋转Screen会触发父UIView上的layoutSubviews事件

6、 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

在开始验证之前,先看看layoutSubviews到底是啥来着:)

Lays out subviews.

The default implementation of this method does nothing on iOS 5.1 and earlier. Otherwise, the default implementation uses any constraints you have set to determine the size and position of any subviews.

在iOS5.1或之前的版本中,这个方法什么也没干.这个方法的默认实现是 用参数来设定subviews的尺寸和位置的 . 

Subclasses can override this method as needed to perform more precise layout of their subviews. You should override this method only if the autoresizing and constraint-based behaviors of the subviews do not offer the behavior you want. You can use your implementation to set the frame rectangles of your subviews directly. 

如果你需要更加精确的布局,可以在子类里面重写这个方法.仅仅在以下情况下:自动布局达不到你想要效果时你才有必要重写这个方法.你可以直接设置subviews的尺寸.

You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method. 

你不能直接调用这个方法.如果你需要强制layout刷新,调用setNeedsLayout来代替.如果你想要立即刷新你的view,调用layoutIfNeeded

大概总结以下就是:

你不要直接调用方法layoutSubviews,如果想要刷新,请调用 setNeedsLayout 或者 layoutIfNeeded

好了,开始验证:)

现在提供继承至UIView的类如下:

<span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span>
<span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);">  TestView.h</span></span><span style="color: rgb(0, 128, 0);">
</span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);">  LayoutSubviews</span></span><span style="color: rgb(0, 128, 0);">
</span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span>
<span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);">  Copyright (c) 2014年 Y.X. All rights reserved.</span></span><span style="color: rgb(0, 128, 0);">
</span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span>
</span>
<span style="color: rgb(0, 0, 255);">#<span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">import</span></span> <UIKit/UIKit.h>

<span style="color: rgb(0, 0, 255);">@interface</span><span style="color: rgb(0, 0, 0);"> TestView : UIView

</span><span style="color: rgb(0, 0, 255);">@end</span>
<span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span>
<span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);">  TestView.m</span></span><span style="color: rgb(0, 128, 0);">
</span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);">  LayoutSubviews</span></span><span style="color: rgb(0, 128, 0);">
</span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span>
<span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);">  Copyright (c) 2014年 Y.X. All rights reserved.</span></span><span style="color: rgb(0, 128, 0);">
</span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span>
</span>
<span style="color: rgb(0, 0, 255);">#<span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">import</span></span> <span style="color: rgb(128, 0, 0);"><span class="string" style="color: rgb(221, 17, 68);">"</span></span><span class="string" style="color: rgb(221, 17, 68);"><span style="color: rgb(128, 0, 0);">TestView.h</span><span style="color: rgb(128, 0, 0);">"</span></span><span style="color: rgb(128, 0, 0);"></span>

<span style="color: rgb(0, 0, 255);">@implementation</span><span style="color: rgb(0, 0, 0);"> TestView

</span>- (<span style="color: rgb(0, 0, 255);">id</span><span style="color: rgb(0, 0, 0);">)initWithFrame:(CGRect)frame
{
<span class="indent">  </span>self </span>=<span style="color: rgb(0, 0, 0);"> [<span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">super</span> initWithFrame:frame];
<span class="indent">  </span></span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">if</span></span><span style="color: rgb(0, 0, 0);"> (self)
<span class="indent">  </span>{
<span class="indent">  </span><span class="indent">  </span>NSLog(</span><span style="color: rgb(128, 0, 0);">@<span class="string" style="color: rgb(221, 17, 68);">"</span></span><span class="string" style="color: rgb(221, 17, 68);"><span style="color: rgb(128, 0, 0);">initWithFrame:%@</span><span style="color: rgb(128, 0, 0);">"</span></span><span style="color: rgb(128, 0, 0);"></span><span style="color: rgb(0, 0, 0);"> ,NSStringFromCGRect(frame));
<span class="indent">  </span>}
<span class="indent">  </span></span><span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">return</span></span><span style="color: rgb(0, 0, 0);"> self;
}

</span>- (<span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">void</span></span><span style="color: rgb(0, 0, 0);">)layoutSubviews
{
<span class="indent">  </span>NSLog(</span><span style="color: rgb(128, 0, 0);">@<span class="string" style="color: rgb(221, 17, 68);">"</span></span><span class="string" style="color: rgb(221, 17, 68);"><span style="color: rgb(128, 0, 0);">layoutSubviews %@</span><span style="color: rgb(128, 0, 0);">"</span></span><span style="color: rgb(128, 0, 0);">, self</span><span style="color: rgb(0, 0, 0);">);
<span class="indent">  </span>[<span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">super</span> layoutSubviews];
}

</span><span style="color: rgb(0, 0, 255);">@end</span>

测试代码:

<span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span>
<span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);">  RootViewController.m</span></span><span style="color: rgb(0, 128, 0);">
</span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);">  LayoutSubviews</span></span><span style="color: rgb(0, 128, 0);">
</span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span>
<span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);">  Copyright (c) 2014年 Y.X. All rights reserved.</span></span><span style="color: rgb(0, 128, 0);">
</span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span>
</span>
<span style="color: rgb(0, 0, 255);">#<span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">import</span></span> <span style="color: rgb(128, 0, 0);"><span class="string" style="color: rgb(221, 17, 68);">"</span></span><span class="string" style="color: rgb(221, 17, 68);"><span style="color: rgb(128, 0, 0);">RootViewController.h</span><span style="color: rgb(128, 0, 0);">"</span></span><span style="color: rgb(128, 0, 0);"></span>
<span style="color: rgb(0, 0, 255);">#<span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">import</span></span> <span style="color: rgb(128, 0, 0);"><span class="string" style="color: rgb(221, 17, 68);">"</span></span><span class="string" style="color: rgb(221, 17, 68);"><span style="color: rgb(128, 0, 0);">TestView.h</span><span style="color: rgb(128, 0, 0);">"</span></span><span style="color: rgb(128, 0, 0);"></span>

<span style="color: rgb(0, 0, 255);">@interface</span><span style="color: rgb(0, 0, 0);"> RootViewController ()

<span class="annotation">@property</span> (nonatomic, strong) NSTimer   </span>*<span style="color: rgb(0, 0, 0);">timer;
<span class="annotation">@property</span> (nonatomic, strong) TestView  </span>*<span style="color: rgb(0, 0, 0);">largeView;
<span class="annotation">@property</span> (nonatomic, strong) TestView  </span>*<span style="color: rgb(0, 0, 0);">smallView;

</span><span style="color: rgb(0, 0, 255);">@end</span>

<span style="color: rgb(0, 0, 255);">@implementation</span><span style="color: rgb(0, 0, 0);"> RootViewController


</span>- (<span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">void</span></span><span style="color: rgb(0, 0, 0);">)viewDidLoad
{
<span class="indent">  </span>[<span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">super</span> viewDidLoad];

<span class="indent">  </span></span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);"> 1、init初始化不会触发layoutSubviews [正确的]</span></span><span style="color: rgb(0, 128, 0);">
<span class="indent">  </span></span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);"> 2、addSubview会触发layoutSubviews [不完全正确,当frame为0时是不会触发的]</span></span><span style="color: rgb(0, 128, 0);">
<span class="indent">  </span></span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);"> 3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化 [正确]</span></span><span style="color: rgb(0, 128, 0);">
<span class="indent">  </span>
</span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);">	[self test_1];</span></span><span style="color: rgb(0, 128, 0);">
</span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);">	[self test_2];</span></span><span style="color: rgb(0, 128, 0);">
</span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);">	[self test_3];</span></span><span style="color: rgb(0, 128, 0);">
<span class="indent">  </span>
<span class="indent">  </span></span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);"> 4、滚动一个UIScrollView会触发layoutSubviews[错误,不用滚动就会触发]</span></span><span style="color: rgb(0, 128, 0);">
</span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);">	[self test_4];</span></span><span style="color: rgb(0, 128, 0);">
<span class="indent">  </span>
<span class="indent">  </span></span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">//</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);"> 5、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件</span></span><span style="color: rgb(0, 128, 0);"></span>
<span style="color: rgb(0, 0, 0);"><span class="indent">  </span>[self test_5];
}


</span>- (<span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">void</span></span><span style="color: rgb(0, 0, 0);">)test_1
{
<span class="indent">  </span></span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">/*</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);"> 
<span class="indent">  </span> 解释:
<span class="indent">  </span> 
<span class="indent">  </span> 走了initWithFrame:方法,但是又有frame值为{{0, 0}, {0, 0}},并不需要绘制任何的东西,
<span class="indent">  </span> 所以即使添加了test,也没必要绘制它,同时也验证了addSubview会触发layoutSubviews是错
<span class="indent">  </span> 误的,只有当被添加的view有着尺寸的时候才会触发layoutSubviews
<span class="indent">  </span> </span><span style="color: rgb(0, 128, 0);">*/</span></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">
<span class="indent">  </span>
<span class="indent">  </span>TestView </span>*test = [TestView <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span></span><span style="color: rgb(0, 0, 0);">];
<span class="indent">  </span>[self.view addSubview:test];
}

</span>- (<span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">void</span></span><span style="color: rgb(0, 0, 0);">)test_2
{
<span class="indent">  </span>TestView </span>*test = [TestView <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span></span><span style="color: rgb(0, 0, 0);">];
<span class="indent">  </span>test.frame </span>= CGRectMake(<span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">0</span></span>, <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">0</span></span>, <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">100</span></span>, <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">100</span></span><span style="color: rgb(0, 0, 0);">);
<span class="indent">  </span>[self.view addSubview:test];
}

</span>- (<span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">void</span></span><span style="color: rgb(0, 0, 0);">)test_3
{
<span class="indent">  </span></span><span style="color: rgb(0, 128, 0);"><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">/*</span></span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;"><span style="color: rgb(0, 128, 0);">
<span class="indent">  </span> 解释:
<span class="indent">  </span> 
<span class="indent">  </span> layoutSubviews这个方法自身无法调用,是被父类添加的时候才执行的方法
<span class="indent">  </span> </span><span style="color: rgb(0, 128, 0);">*/</span></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">
<span class="indent">  </span>
<span class="indent">  </span>TestView </span>*test = [TestView <span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">new</span></span><span style="color: rgb(0, 0, 0);">];
<span class="indent">  </span>test.frame </span>= CGRectMake(<span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">0</span></span>, <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">0</span></span>, <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">50</span></span>, <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">50</span></span><span style="color: rgb(0, 0, 0);">);
<span class="indent">  </span>UIView </span>*showView = [[UIView alloc] initWithFrame:CGRectMake(<span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">0</span></span>, <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">0</span></span>, <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">50</span></span>, <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">50</span></span><span style="color: rgb(0, 0, 0);">)];
<span class="indent">  </span>[test addSubview:showView];
}

</span>- (<span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">void</span></span><span style="color: rgb(0, 0, 0);">)test_4
{
<span class="indent">  </span>CGRect rect	</span>=<span style="color: rgb(0, 0, 0);"> self.view.bounds;
<span class="indent">  </span>CGFloat height </span>=<span style="color: rgb(0, 0, 0);"> rect.size.height;
<span class="indent">  </span>CGFloat width  </span>=<span style="color: rgb(0, 0, 0);"> rect.size.width;
<span class="indent">  </span>
<span class="indent">  </span>UIScrollView </span>*rootScroll =<span style="color: rgb(0, 0, 0);"> [[UIScrollView alloc] initWithFrame:self.view.bounds];
<span class="indent">  </span>NSArray </span>*data			= @[<span style="color: rgb(128, 0, 0);">@<span class="string" style="color: rgb(221, 17, 68);">""</span></span>, <span style="color: rgb(128, 0, 0);">@<span class="string" style="color: rgb(221, 17, 68);">""</span></span>, <span style="color: rgb(128, 0, 0);">@<span class="string" style="color: rgb(221, 17, 68);">""</span></span>, <span style="color: rgb(128, 0, 0);">@<span class="string" style="color: rgb(221, 17, 68);">""</span></span><span style="color: rgb(0, 0, 0);">];
<span class="indent">  </span>[data enumerateObjectsUsingBlock:</span>^(<span style="color: rgb(0, 0, 255);">id</span> obj, NSUInteger idx, BOOL *<span style="color: rgb(0, 0, 0);">stop) {
<span class="indent">  </span><span class="indent">  </span>TestView </span>*tmp		= [[TestView alloc] initWithFrame:CGRectMake(width*idx, <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">0</span></span><span style="color: rgb(0, 0, 0);">,
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>  width, height)];
<span class="indent">  </span><span class="indent">  </span>[rootScroll addSubview:tmp];
<span class="indent">  </span>}];
<span class="indent">  </span>rootScroll.contentSize   </span>= CGSizeMake(width *<span style="color: rgb(0, 0, 0);"> data.count, height);
<span class="indent">  </span>[self.view addSubview:rootScroll];
}

</span>- (<span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">void</span></span><span style="color: rgb(0, 0, 0);">)test_5
{
<span class="indent">  </span>_timer </span>= [NSTimer scheduledTimerWithTimeInterval:<span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">1</span></span><span class="number" style="color: rgb(0, 153, 153);"><span style="color: rgb(0, 0, 0);">.</span></span><span style="color: rgb(0, 0, 0);">f
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>  target:self
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>selector:<span class="annotation">@selector</span>(timerEvent:)
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>userInfo:nil
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span> repeats:YES];
<span class="indent">  </span>_largeView </span>=<span style="color: rgb(0, 0, 0);"> [[TestView alloc] initWithFrame:self.view.bounds];
<span class="indent">  </span>[self.view addSubview:_largeView];
<span class="indent">  </span>
<span class="indent">  </span>_smallView </span>= [[TestView alloc] initWithFrame:CGRectMake(<span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">0</span></span>, <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">0</span></span>, <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">100</span></span>, <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">100</span></span><span style="color: rgb(0, 0, 0);">)];
<span class="indent">  </span>[_largeView addSubview:_smallView];
}

</span>- (<span style="color: rgb(0, 0, 255);"><span class="keyword" style="color: rgb(51, 51, 51); font-weight: bold;">void</span></span>)timerEvent:(<span style="color: rgb(0, 0, 255);">id</span><span style="color: rgb(0, 0, 0);">)sender
{
<span class="indent">  </span>_smallView.frame </span>= CGRectMake(arc4random()%<span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">100</span></span> + <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">20</span></span><span style="color: rgb(0, 0, 0);">,
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>  arc4random()</span>%<span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">100</span></span> + <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">20</span></span><span style="color: rgb(0, 0, 0);">,
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>  arc4random()</span>%<span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">100</span></span> + <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">20</span></span><span style="color: rgb(0, 0, 0);">,
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>  arc4random()</span>%<span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">100</span></span> + <span style="color: rgb(128, 0, 128);"><span class="number" style="color: rgb(0, 153, 153);">20</span></span><span style="color: rgb(0, 0, 0);">);
<span class="indent">  </span>NSLog(</span><span style="color: rgb(128, 0, 0);">@<span class="string" style="color: rgb(221, 17, 68);">"</span></span><span class="string" style="color: rgb(221, 17, 68);"><span style="color: rgb(128, 0, 0);">_smallView %@</span><span style="color: rgb(128, 0, 0);">"</span></span><span style="color: rgb(128, 0, 0);"></span><span style="color: rgb(0, 0, 0);">, _smallView);
<span class="indent">  </span>NSLog(</span><span style="color: rgb(128, 0, 0);">@<span class="string" style="color: rgb(221, 17, 68);">"</span></span><span class="string" style="color: rgb(221, 17, 68);"><span style="color: rgb(128, 0, 0);">_smallView %@</span><span style="color: rgb(128, 0, 0);">"</span></span><span style="color: rgb(128, 0, 0);"></span><span style="color: rgb(0, 0, 0);">, _largeView);
}

</span><span style="color: rgb(0, 0, 255);">@end</span>

测试后的结论是这样子的:

1. 一个view是不能够自己调用layoutSubviews,如果要调用,需要调用 setNeedsLayout或者 layoutIfNeeded

2. 如果view的frame值为0,即使被添加了耶不会调用layoutSubviews

3. 如果一个view的frame值改变了,那么它的父类的layoutSubviews也会被执行

layoutSubviews对subviews重新布局

layoutSubviews方法调用先于drawRect

setNeedsLayout在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews

layoutIfNeeded方法如其名,UIKit会判断该receiver是否需要layout.根据Apple官方文档,layoutIfNeeded方法应该是这样的

 layoutIfNeeded遍历的不是superview链,应该是subviews链

drawRect是对receiver的重绘,能获得context

setNeedDisplay在receiver标上一个需要被重新绘图的标记,在下一个draw周期自动重绘,iphone device的刷新频率是60hz,也就是1/60秒后重绘

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章