本文主要介绍了iOS中UIView的layoutSubviews的布局方法,并给出了一个在iPad水平和垂直切换时layoutSubviews被调用重新布局的例子。有需要的朋友可以参考一下。
概念
UIView中有一个方法layoutSubviews:
复制代码如下:
- (void)布局子视图;//覆盖点。由layoutIfNeeded自动调用。从iOS 6.0开始,当使用基于约束的布局时,基本实现应用基于约束的布局,否则不执行任何操作。
layoutSubviews方法的具体功能
LayoutSubviews是子视图的一种新布局。例如,当我们想要更新子视图的位置时,我们可以调用layoutSubviews方法来重新排列子视图。
默认情况下,LayoutSubviews不做任何事情。使用时,需要在雷子重写。
例子
因为ipad的横屏和竖屏不一样,好的应用横屏和竖屏的页面布局也不一样。那么就需要横竖屏的整体解决方案。我们来看一个不同屏幕布局的界面。
下面两张图是同一界面的横版和竖版截图。可以看到横版和竖版显示的内容是一样的,只是界面布局不同。为了实现上面的布局,我们主要使用UIView中的layoutSubviews方法。当UIView设置为自动适应屏幕时,当用户旋转设备时,将调用layoutSubviews方法。我们只需要重写这个方法,然后判断用户屏幕的方向。只需调整每个空格的位置。
下面是实现上述接口的最简单的原型:
首先我们可以知道左边是图片,右边是图片加文字视图。这里有一个例子,左边是一个视图,右边是一个带有段落的图片。
案件截图如下
右边的文本和绿色部分由一个applet封装。
整个布局就是我在主视图中添加了一个ContentView,在ContentView中添加了一个ArticleView。
ArticleView和ContentView的xib文件都被打开。
在ContentView中重写layoutSubviews方法,然后根据stausbar的方向判断当前视图的横竖屏。特定代码:
复制代码如下:
-(void)布局子视图{
[超级布局子视图];
UIDeviceOrientation interface orientation=[[ui application shared application]status barorientation];
if(interface orientation==uideviceorientation portraitupdatedown | | interface orientation==uideviceorientation portraitupdatedown){
//当翻转到垂直屏幕时
[self setvertical frame];
} else if(interface orientation==uideviceorientationlandscape left | | interface orientation==uideviceorientationlandscape right){
//当翻转到横向时
[self setHorizontalFrame];
}
}
-(void)setVerticalFrame
{
NSLog(@ 竖屏);
[可标题setFrame:CGRectMake(283,0,239,83)];
[left view set frame:CGRectMake(38,102,384,272)];
[right view set frame:CGRectMake(450,102,282,198)];
}
-(void)setHorizontalFrame
{
NSLog(@ 风景);
[可标题setFrame:CGRectMake(183,0,239,83)];
[left view set frame:CGRectMake(168,122,384,272)];
[right view set frame:CGRectMake(650,122,282,198)];
}
在特定屏幕方法中,可以重新设置每个组件的坐标。
接下来,将ArticleView视图添加到ContentView中。
复制代码如下:
-(id)initWithCoder:(ns coder *)ade coder
{
if((self=[super initwithcode:ade coder]){
NSArray * arrayContentView=[[ns bundle main bundle]loadNibNamed:@ article view owner:self options:nil];
right view=[arrayContentView object atindex:0];
【自行添加子视图:right view】;
}
回归自我;
}
由于我使用的是xib,所以初始化方法是initWithCoder,并为此添加了一个新视图。
同样,在ArticleView中设置屏幕对应空间的坐标。
复制代码如下:
-(void)布局子视图{
[超级布局子视图];
UIDeviceOrientation interface orientation=[[ui application shared application]status barorientation];
CGRect rect=self.frame
rect . size . width=282;
rect . size . height=198;
[self set frame:rect];
如果(接口方向==uildevieworientportrait interfaces ignition==uildevieworientportrailpage down){ .
赵一郎道
[自订垂直框架];
}else if(界面方向==uildorientationlandscape interfacial orientation==uildorientlandscape){ .
陆伯麟儿
[自订水平框架];
}表示
}表示
(void)setVerticalFrame
-好的
nslog(@ @ ##):
[内容视图设置框架:CG矩形制作(12、6、250、125)]:
[文本标签集框架:CG rect maker(50、139、182、39)];
}表示
(无效)设定水平框架
-好的
nslog(@ #):
[内容视图设置框架:CG矩形制作(12、6、106、158)];
[文本标签集框架:CGRectMake(135、11、147、39)];
}表示
字幕ocr:贾宝玉字幕校对:贾宝玉
布置子列席吴亚玲:
张惠卿,张惠卿,张惠卿布局子考官。宋神宗时,吕惠国的版面检视者?张惠卿、吕惠卿、吕惠卿安排次官检视。
张惠卿布置子视图。(范希阳)
你的名字是。
吴亚玲站在吴亚玲的面前。
唐季龙的卷轴。
春荫屏住了绿筠小姐对云娥的布置子进行了采访。
吴亚玲在查看吴亚玲的布局。
张惠卿,张惠卿。吕惠卿道:
将视图"添加子视图"添加到视图"布局子视图"中。
张惠卿与张惠卿进行版面访谈。吴亚玲,吴亚玲,吴亚玲。