layoutSubviews总结

转自:http://blog.csdn.net/hmt20130412/article/details/24533903


今天跟旺才兄学习了一下UIView的setNeedsDisplay和setNeedsLayout方法。首先两个方法都是异步执行的。而setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。

上所诉,setNeedsDisplay方便绘图,而layoutSubViews方便出来数据。

ipad横竖屏切换解决方案
2011年08月01日 星期一 10:09
由于ipad的横竖屏不同,所以好的应用,横竖屏的页面布局也不一样。那么就需要横竖屏的整体解决方案。先看一个横竖屏布局不一样的界面。

上面两张图是来自同一个界面的横竖版的截屏。可以看出,横竖版显示的内容相同,但是界面布局不同。要实现上述布局,主要是运用UIView中 layoutSubviews方法。当UIView设置为自动适配屏幕时,当用户旋转设备的时候,会调用layoutSubviews方法,我们只需重写 这个方法,然后判断用户屏幕的方向。在调整每个空间的位置即可。

layoutSubviews总结_第1张图片

layoutSubviews总结_第2张图片

下面是实现上述界面的最简单的原型:

首先分析可以知道左面是图片,右面是一个图片加文字的视图。下面就实现一个左面视图右面是一个图加一段字的事例。
事例的截图如下:

layoutSubviews总结_第3张图片

layoutSubviews总结_第4张图片

其中右面的文字和绿色部分是用一个子视图封装的。
整个布局是我在主视图中添加了一个ContentView视图,在ContentView视图中添加了一个ArticleView视图。
其中ArticleView和ContentView的xib文件都打开了


[objc]  view plain copy
  1. 在ContentView中重写layoutSubviews方法,然后根据stausbar的方向判断当前视图的横竖屏。具体代码:  
  2. -(void)layoutSubviews{   
  3. [super layoutSubviews];   
  4. UIDeviceOrientation interfaceOrientation=[[UIApplication sharedApplication] statusBarOrientation];   
  5. if (interfaceOrientation == UIDeviceOrientationPortrait || interfaceOrientation == UIDeviceOrientationPortraitUpsideDown) {   
  6. //翻转为竖屏时   
  7. [self setVerticalFrame];   
  8. }else if (interfaceOrientation==UIDeviceOrientationLandscapeLeft || interfaceOrientation == UIDeviceOrientationLandscapeRight) {   
  9. //翻转为横屏时   
  10. [self setHorizontalFrame];   
  11. }   
  12. }  
  13.   
  14. -(void)setVerticalFrame   
  15. {   
  16. NSLog(@"竖屏");   
  17. [titleLable setFrame:CGRectMake(283023983)];   
  18. [leftView setFrame:CGRectMake(38102384272)];   
  19. [rightView setFrame:CGRectMake(450102282198)];   
  20. }  
  21.   
  22. -(void)setHorizontalFrame   
  23. {   
  24. NSLog(@"横屏");   
  25. [titleLable setFrame:CGRectMake(183023983)];   
  26. [leftView setFrame:CGRectMake(168122384272)];   
  27. [rightView setFrame:CGRectMake(650122282198)];   
  28. }  
  29.   
  30. 在具体的横竖屏方法中,从新设置各个组件的坐标即可。  
  31.   
  32. 接下来在ContentView中添加ArticleView视图。  
  33. -(id)initWithCoder:(NSCoder *)aDecoder   
  34. {   
  35. if ((self = [super initWithCoder:aDecoder])) {  
  36.   
  37. NSArray *arrayContentView =[[NSBundle mainBundle] loadNibNamed:@"ArticleView" owner:self options:nil];   
  38. rightView=[arrayContentView objectAtIndex:0];   
  39. [self addSubview:rightView];   
  40. }   
  41. return self;   
  42. }  
  43.   
  44. 由于我用的是xib,所以初始化方法为initWithCoder,在这个中添加新的视图。  
  45.   
  46. 同样在ArticleView中设置横竖屏相应空间的坐标即可。  
  47. -(void)layoutSubviews{   
  48. [super layoutSubviews];   
  49. UIDeviceOrientation interfaceOrientation=[[UIApplication sharedApplication] statusBarOrientation];   
  50. CGRect rect=self.frame;   
  51. rect.size.width=282;   
  52. rect.size.height=198;   
  53. [self setFrame:rect];   
  54. if (interfaceOrientation == UIDeviceOrientationPortrait || interfaceOrientation == UIDeviceOrientationPortraitUpsideDown) {   
  55. //翻转为竖屏时   
  56. [self setVerticalFrame];   
  57. }else if (interfaceOrientation==UIDeviceOrientationLandscapeLeft || interfaceOrientation == UIDeviceOrientationLandscapeRight) {   
  58. //翻转为横屏时   
  59. [self setHorizontalFrame];   
  60. }   
  61. }  
  62.   
  63. -(void)setVerticalFrame   
  64. {   
  65. NSLog(@"竖屏");   
  66. [contentView setFrame:CGRectMake(126250125)];   
  67. [textLable setFrame:CGRectMake(5013918239)];   
  68. }  
  69.   
  70. -(void)setHorizontalFrame   
  71. {   
  72. NSLog(@"横屏");   
  73. [contentView setFrame:CGRectMake(126106158)];   
  74. [textLable setFrame:CGRectMake(1351114739)];   
  75. }  

@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初始化不会触发layoutSubviews
2、addSubview会触发layoutSubviews
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
4、滚动一个UIScrollView会触发layoutSubviews
5、旋转Screen会触发父UIView上的layoutSubviews事件
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件


你可能感兴趣的:(layoutSubviews总结)