`
anlulu
  • 浏览: 41843 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

LayoutSubViews 学习(转载)

    博客分类:
  • ios
ios 
阅读更多

layoutSubviews何时调用的问题

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

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

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

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

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

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


在ContentView中重写layoutSubviews方法,然后根据stausbar的方向判断当前视图的横竖屏。具体代码:
-(void)layoutSubviews{ 
[super layoutSubviews]; 
UIDeviceOrientation interfaceOrientation=[[UIApplication 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]; 

return self; 
}

由于我用的是xib,所以初始化方法为initWithCoder,在这个中添加新的视图。

同样在ArticleView中设置横竖屏相应空间的坐标即可。
-(void)layoutSubviews{ 
[super layoutSubviews]; 
UIDeviceOrientation interfaceOrientation=[[UIApplication sharedApplication] statusBarOrientation]; 
CGRect rect=self.frame; 
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初始化不会触发layoutSubviews
2、addSubview会触发layoutSubviews
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
4、滚动一个UIScrollView会触发layoutSubviews
5、旋转Screen会触发父UIView上的layoutSubviews事件
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

分享到:
评论

相关推荐

    详解iOS中UIView的layoutSubviews子视图布局方法使用

    主要介绍了iOS中UIView的layoutSubviews子视图布局方法使用,文中举了一个layoutSubviews在iPad横竖屏切换时被调用用来重新布局的实例,需要的朋友可以参考下

    DSCollectionView

    索引条部分使用UIView 的 layoutSubviews绘制字母和边框线 setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就...

    swift——自定义UITabBar,UITabBarController和UINavigationController

    自定义UITabBar,layoutSubviews重写UITabBarButton位置,重写则hitTest方法并监听按钮的点击 自定义的UITabBarController和UINavigationController

    一款实现封面流动的效果

    在使用这份代码时遇到一点问题,提出了他自己的解决方案:这个代码中reloaddata后,调用layoutsubviews应移除掉之前的subviews,然后加上[[_scrollView subviews] makeObjectsPerformSelector:@selector...

    ios-个性化TabBar.zip

    需求: 中间按钮 需要个性化 思路 : 利用KVC 对 TabBarController 的 tabBar 赋值 然后 子类化 UITabBar 重写 layoutSubviews 找到 UITabBarButton 重新布局

    自定义警告框、弹出框AlertView

    自定义警告框、弹出框AlertView 自定义AlertView 实现自定义UIAlertView。继承UIAlertView,改写其中的layoutSubviews方法,用于自定义UIAlertView的外观

    iOS开发中TabBar再次点击实现刷新效果

    需求 之前已经实现了自定义TabBar,如图所示:   自定义TabBar.jpeg 现在需要实现一个类似今日头条TabBar的功能 —— 如果继续点击当前...1. 自定义TabBar的layoutSubviews中绑定事件 - (void)layoutSubviews { [supe

    zhengjie19901102#Objective-C#IOS购物车UIButton版本1

    IOS购物车UIButton版本备忘笔录UIButton代码://别忘了调用父类的layoutSubviews方法//设置图片及文字的位置大小//获取数据进按钮

    快速的微框架,用于在功能上声明自动布局约束-Swift开发

    您可以在Interface Builder中使用“自动布局”,可以在代码中使用“自动布局”并维护对这些约束的引用,或者可以使用layoutSubviews实现布局功能。 这些方法中的每一种都有优点和缺点。 如果您使用layoutSubviews...

    Storybook-ios:用于在iOS中更快地进行UI开发的UI组件预览器(当前仅支持UIKit)

    适用于iOS的故事书 适用于iOS的Storybook是一个可提高UI开发速度的库。 它使我们能够独立预览UI可以显示的每个状态的组件。... public override func layoutSubviews () { super . layoutSubviews () backgroundColo

    自定义tabbar,简单,易用

    自定义tabBar,简单,易用 使用说明: 1.修改初始化数据 #pragma mark 初始化数据 在 -(instancetype)init 方法里面 2.修改底部图片文字布局 在TabBarButton.m 文件的 layoutSubviews 方法里面

    JZLTabBar:自定义类似淘宝TabBar

    2018.7.7更新 1.更改masonry约束布局为frame布局 2.支持设置角标 3.支持自定义角标颜色和背景颜色 4.支持清除角标 自定义类似淘宝TabBar 公司的项目需求是tabbar和...- (void)layoutSubviews { [super layoutSubviews];

    ios-纯代码封装性搭建新浪微博框架.zip

    7.自定义的tabbar类的的UITabbarItem的layoutSubViews方法中布局所有的字视图; 8.记录按钮的tag,设置当前选中按钮,同时在按钮事件中设置选中和取消选中状态; 9.在tabbar类设置代理,回传选中按钮的tag,用来...

    自定义带有UITableView的UIAlertView

    项目中用到带有带有UITableView的UIAlertView,刚开始的做法 是 UIAlertView 的基础上addsubview上UITableView,...重写了 layoutSubviews方法,可以用于横竖屏切换 ,UITableView的位置大小 在 UIAlertView内。

    Modern Auto Layout.zip

    How to subclass UIView and make friends with layoutSubviews How to build programmatic layouts without storyboards What is Auto Layout? What is a constraint? Who owns a constraint? How many ...

    DYChart

    Semi Chircle仪表板示例: let dashCircle = DYDashboardCircle()dashCircle.value(to: 0.9, animated: true)dashCircle.layoutSubviews()view.addSubview(dashCircle)其他配置: var circleColors: [UIColor]任何...

    Paged Flow View(iPhone源代码)

     @flycent_stars 在使用这份代码时遇到一点问题,提出了他自己的解决方案:这个代码中reloaddata后,调用layoutsubviews应移除掉之前的subviews,然后加上[[_scrollView subviews] makeObjectsPerformSelector:@...

    iOS 将系统自带的button改装成上图片下文字的样子

    代码是通过继承UIButton,然后再重写layoutSubviews方法,对自带的图片和titleLabel进行重新的layout,代码如下: // // ZZZUpDownButton.h // // Copyright :copyright: 2016年 George. All rights reserved. // /...

    LayoutLoopHunter:基于运行时的设置,用于跟踪自动布局反馈循环

    LayoutLoopHunter 该库通过在实时代码中复制UIViewLayoutFeedbackLoopDebuggingThreshold的行为来帮助捕获由自动布局反馈循环引起的OOM。 这是上的运行时教程的最终... 当在单个运行循环中多次调用layoutSubviews

Global site tag (gtag.js) - Google Analytics