何时如何使用layout layoutSubviews 方法

layoutSubviews何时调用的问题(转)_iOS开发_动态网站制作指南
layoutSubviews何时调用的问题(转)
来源:人气:302
今天跟旺才兄学习了一下UIView的setNeedsDisplay和setNeedsLayout方法。首先两个方法都是异步执行的。而setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。
宗上所诉,setNeedsDisplay方便绘图,而layoutSubViews方便出来数据。\
ad横竖屏切换解决方案日 星期一 10:09由于ipad的横竖屏不同,所以好的应用,横竖屏的页面布局也不一样。那么就需要横竖屏的整体解决方案。先看一个横竖屏布局不一样的界面。
上面两张图是来自同一个界面的横竖版的截屏。可以看出,横竖版显示的内容相同,但是界面布局不同。要实现上述布局,主要是运用UIView中 layoutSubviews方法。当UIView设置为自动适配屏幕时,当用户旋转设备的时候,会调用layoutSubviews方法,我们只需重写 这个方法,然后判断用户屏幕的方向。在调整每个空间的位置即可。
下面是实现上述界面的最简单的原型:
首先分析可以知道左面是图片,右面是一个图片加文字的视图。下面就实现一个左面视图右面是一个图加一段字的事例。事例的截图如下:
其中右面的文字和绿色部分是用一个子视图封装的。整个布局是我在主视图中添加了一个ContentView视图,在ContentView视图中添加了一个ArticleView视图。其中ArticleView和ContentView的xib文件都打开了
在ContentView中重写layoutSubviews方法,然后根据stausbar的方向判断当前视图的横竖屏。具体代码:-(void)layoutSubviews{ [super layoutSubviews]; UIDeviceOrientation interfaceOrientation=[[UI sharedApplication] statusBarOrientation]; if (interfaceOrientation == UIDeviceOrientationPortrait || interfaceOrientation == UIDeviceOrientationPortraitUpsideDown) { //翻转为竖屏时 [self setVerticalFrame]; }else if (interfaceOrientation==UIDeviceOrientationLandscapeLeft || interfaceOrientation == UIDeviceOrientationLandscapeRight) { //翻转为横屏时 [self setHorizontalFrame]; } }
-(void)setVerticalFrame { NSLog(@"竖屏"); [titleLable setFrame:CGRectMake(283, 0, 239, 83)]; [leftView setFrame:CGRectMake(38, 102, 384, 272)]; [rightView setFrame:CGRectMake(450, 102, 282, 198)]; }
-(void)setHorizontalFrame { NSLog(@"横屏"); [titleLable setFrame:CGRectMake(183, 0, 239, 83)]; [leftView setFrame:CGRectMake(168, 122, 384, 272)]; [rightView setFrame:CGRectMake(650, 122, 282, 198)]; }
在具体的横竖屏方法中,从新设置各个的坐标即可。
接下来在ContentView中添加ArticleView视图。-(id)initWithCoder:(NSCoder *)aDecoder { if ((self = [super initWithCoder:aDecoder])) {
NSArray *arrayContentView =[[NSBundle mainBundle] loadNibNamed:@"ArticleView" owner:self options:nil]; rightView=[arrayContentView objectAtIndex:0]; [self addSubview:rightView]; }
由于我用的是xib,所以初始化方法为initWithCoder,在这个中添加新的视图。
同样在ArticleView中设置横竖屏相应空间的坐标即可。-(void)layoutSubviews{ [super layoutSubviews]; UIDeviceOrientation interfaceOrientation=[[UIApplication sharedApplication] statusBarOrientation]; CGRect rect=self. rect.size.width=282; rect.size.height=198; [self setFrame:rect]; if (interfaceOrientation == UIDeviceOrientationPortrait || interfaceOrientation == UIDeviceOrientationPortraitUpsideDown) { //翻转为竖屏时 [self setVerticalFrame]; }else if (interfaceOrientation==UIDeviceOrientationLandscapeLeft || interfaceOrientation == UIDeviceOrientationLandscapeRight) { //翻转为横屏时 [self setHorizontalFrame]; } }
-(void)setVerticalFrame { NSLog(@"竖屏"); [contentView setFrame:CGRectMake(12, 6, 250, 125)]; [textLable setFrame:CGRectMake(50, 139, 182, 39)]; }
-(void)setHorizontalFrame { NSLog(@"横屏"); [contentView setFrame:CGRectMake(12, 6, 106, 158)]; [textLable setFrame:CGRectMake(135, 11, 147, 39)]; }
layoutSubviews何时调用的问题
layoutSubviews何时调用的问题,这个方法是当你需要在调整subview的大小的时候需要重写(我这个不严谨,以下是原文:You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.),但有时候经常指望它被调用的时候没被调用,不希望它被调用的时候被调用了,搞的很上火。根据国外社区一个人帖子,做了总结性翻译。
layoutSubviews在以下情况下会被调用:
1、init初始化不会触发layoutSubviews2、addSubview会触发layoutSubviews3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化4、滚动一个UIScrollView会触发layoutSubviews5、旋转Screen会触发父UIView上的layoutSubviews事件6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
优质网站模板iOS - layoutSubview方法的调用 - 简书
iOS - layoutSubview方法的调用
作者:Mitchell
当我们想设置子控件的frame的时候我们尽量在系统提供的layoutSubviews这个方法中来设置,因为当我们改变我们父类的frame的时候(准确说是size,因为当我们只改变位置的时候,是不走layoutSubviews的),内部子控件的排布可能会跟着改变,那么我们肯定会走layoutSubviews这个方法,所以我们应该尽可能在这里进行子控件frame的重新赋值。那么layoutSubviews这个方法就能够帮助内部的子控件自适应。
什么时候会调用layoutSubviews这个方法?
当我们初始化控件的时候会调用一次,因为内部会对控件的内部排列进行一次初始化。就算在这里我们只调用init初始化不给frame也会默认进行一次内部的调用,因为内部机制会进行一次默认的布局。
当我们改变控件的size的时候,注意这里不是frame,会调用;
当我们改变控件中的子控件的时候,这里是frame,会调用。
当我们改变父控件的size的时候,也会调用子控件的layoutSubviews。
成长中的开发者,主页:http://mitchell-问说网手机版
躺着 站着 跪着轻松访问
问说网 / 蜀ICP备号
感谢您对问说网的支持,提出您在使用过程中遇到的问题或宝贵建议,您的反馈对我们产品的完善有很大帮助。
您的反馈我们已收到!
感谢您提供的宝贵意见,我们会在1-2个工作日,通过您留下的联系方式将处理结果反馈给您!}

我要回帖

更多关于 如何使用layout 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信