网贷平台资金存管倒闭资金能收回吗

Android应用的开发用的是Java语言,底层是Linux代码,Google公司为广大的开发者提供了开发所需的必要接口,开发人员无需了解底层操作机制便可写出优秀的应用软件。本文所设计的一款简易计算器是一款具备基本四则运算的软件,可以在android平台上完美运行,在模拟器和真机上均能测试通过。1软件设计具体规范1.1 布局方式与布局文件在开始设计软件之前,首先要考虑的是布局问题,本文采用的是相对布局(RelativeLayout),因为九方格计算器可以看做是一个个的按钮和显示框组合而成,而android提供的线性布局(LinearLayout)、表格布局(TableLayout)、绝对布局(AbsoluteLayout)相对来说都有些繁琐,故采取此种布局方式,关键代码如下:&RelativeLayout xmlns:android=&/apk/res/android&xmlns:tools=&/tools&&……&/RelativeLayout&1.2 功能代码的编写在android中,最基础...
相关文章推荐
11月12日,谷歌(Google)的&移动机器人(Android)&的软件开发工具包(SDK)正式发布,并且拿出1000万美元奖励An- droid的开发者。机器人Android开发包(SDK)发布之后,在全球范围内...
《信息系统工程》2007年12期
在去年GOOGLE公开Android行动软件平台之后也提供了1,000万美金作为软件开发人员参与Android程序开发人员竞赛(AndroidDeveloperChallenge)的奖金。这项比赛分为两个阶段,第...
《电子与电脑》2008年08期
随着3G市场的启动,琦基i6 goal、联想OPhone、华为Android手机等产品纷纷浮出水面。而中国移动、中国电信等运营商也开始使用Android系统打造自己的操作系统,2009年俨然将成...
《互联网天地》2009年04期
虽然Google持续在市场上推动其所主导的开放原始码Android平台智能型手机,但是大部分的产业专家都了解,制造商必需花上一年以上的时间进行开发和生
《电子与电脑》2010年02期
我们遍寻了Android Market手机应用市场,精挑细选出10款目前最佳的应用,编撰出这份必备Android应用列表,并按首字母排序。手机软件不管你对什么感兴趣,Android Market手机应...
《微电脑世界》2010年04期
尽管乔布斯让iPhone红得发紫,即便是在今天iPhone 4如此表现之下,仍无法让人们对其追捧的热度有所回冷。但是对苹果的iPhone平台而言,谷歌的Android操作系统以及微软的Windo...
《微电脑世界》2010年08期
著名的投资时事分析员、&经济气象站(Economic Weather Station)&作家Jason Schwarz在投资时事通讯的文章说,到2010年底,市面上将会有115款谷歌Android手机以及50款非手机的...
《中国电子商情(基础电子)》2010年09期
买来Android系统的手机后,还需选好软件,才能发挥手机硬件最大的威力。Android系统支持多点触控,支持aGPS卫星定位,支持GPRS移动互联,支持wifi无线协议,支持重力感应,支持蓝...
《电脑迷》2010年15期
越来越多的朋友问我:Google手机究竟如何?通常我都会纠正一下:你是指Android系统手机?他们会很疑惑:这不是一回事?的确不是。Android系统风头正劲,口碑好像还不
《电脑迷》2010年13期
ZTE Corporation and Three havelaunched the ZTE Racer,a low cost Android 2.1(éclair)powered handset.The Racer is the first Android handset in the UK from ZTE a...
《ZTE Communications》2010年03期博客访问: 10700
博文数量: 4
博客积分: 1400
博客等级: 上尉
技术积分: 50
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
为了深入理解和应用Android框架系统的控件以及更加熟练的掌握eclips的开发技巧,所以就决定做一个简单的计算器来了解和介绍一下Android界面设计的基本技巧。界面的样子如下:
这个界面由一个编辑框和很多按钮组成。他的功能跟Windows下的计算其功能差不多,就是实现+-*/等功能。这个还实现了一个菜单的功能。按一下Exit就可以离开这个应用程序了。
Android框架定义了很多布局(Layout)架构。布局就像容器,里面可以装下很多控件。布局里面还可以套用其他的布局。这样就可以实现界面的多样化以及设计的灵活性。在这个界面中,我们应用了一个LinearLayout的布局,它是垂直向下扩展的。在这个LinearLayout中,我们可以应用一个EditText和一个TableLayout作为他的子控件。在TableLayout布局可以实现以表格的形式来布局空间。而TableRow是用来定义每一行。在TableLayout中,列的宽度是取其中这一列中宽度最大的控件的宽度。这个应用程序正好用到5x5的一个表格,TableLayout将是最好的选择了。
Android界面编程的一个优势是他的布局全部可以用xml文件来描述,实现了即改即现的方式。ADT又在Eclips里面做了一个Outline的插件。当你打开布局xml文件的时候,Outline就会显示布局的所有控件以及他们的结构。双击其中的控件就会打开空间的属性。你就可以直接编辑属性来轻松实现界面的布局。所改的属性也将立刻在xml文件中显示出来。以下是描述这个简单计算器的界面xml文件给大家做个参考:
&?xml version="1.0" encoding="utf-8"?&&LinearLayout xmlns:android="/apk/res/android"&&&&android:orientation="vertical"&&&&android:layout_width="fill_parent"&&&&android:layout_height="fill_parent"&&&&android:background="#ff808080"&&&&&&&&&&EditText android:id="@+id/input" &&&&&&&&android:layout_width="fill_parent"&&&&&&&&android:layout_height="wrap_content"&&&&&&&&android:cursorVisible="false"&&&&&&&&android:gravity="right"&&&&&&&&android:editable = "false"/&&&&&&TableLayout xmlns:android="/apk/res/android"&&&& android:layout_width="fill_parent"&&&& android:layout_height="fill_parent"&&&& &&&&&&&&&&TableRow &&&&&&&& android:layout_width="fill_parent" &&&&&&&& android:layout_height="wrap_content" &&&&&&&& &&&&&&&&&&&&&&&&&&Button android:id="@+id/seven" &&&&&&&&&&&& android:text="7"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" &&&&&&&&&&&&&&&&android:layout_width="63sp"/&&&&&&&&&&&&&&&&&&Button android:id="@+id/eight" &&&&&&&&&&&& android:text="8"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/nine" &&&&&&&&&&&& android:text="9"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/divide" &&&&&&&&&&&& android:text="/"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/sqrt" &&&&&&&&&&&& android:text="sqrt"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&& &&&& &&&&&&&&&&&&&&&& &&&& &&&&&&&&&/TableRow&&&&& &&&& &&&&&&&&&TableRow &&&&&&&& android:layout_width="fill_parent" &&&&&&&& android:layout_height="wrap_content" &&&&&&&& &&&&&&&&&&&&&&&&&&Button android:id="@+id/four" &&&&&&&&&&&& android:text="4"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/five" &&&&&&&&&&&& android:text="5"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/six" &&&&&&&&&&&& android:text="6"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/multiply" &&&&&&&&&&&& android:text="*"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/remainder" &&&&&&&&&&&& android:text="%"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&& &&&& &&&&&&&&&&&&&&&& &&&& &&&&&&&&&/TableRow&&&&& &&&&&&&& &&&&&&&&&TableRow &&&&&&&& android:layout_width="fill_parent" &&&&&&&& android:layout_height="wrap_content" &&&&&&&& &&&&&&&&&&&&&&&&&&Button android:id="@+id/one" &&&&&&&&&&&& android:text="1"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/two" &&&&&&&&&&&& android:text="2"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/three" &&&&&&&&&&&& android:text="3"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/minus" &&&&&&&&&&&& android:text="-"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/convert" &&&&&&&&&&&& android:text="1/x"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&& &&&& &&&&&&&&&&&&&&&& &&&& &&&&&&&&&/TableRow&&&&& &&&&&&&&&&&&&TableRow &&&&&&&& android:layout_width="fill_parent" &&&&&&&& android:layout_height="wrap_content" &&&&&&&& &&&&&&&&&&&&&&&&&&Button android:id="@+id/zero" &&&&&&&&&&&& android:text="0"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/digit" &&&&&&&&&&&& android:text="."&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/equal" &&&&&&&&&&&& android:text="="&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/plus" &&&&&&&&&&&& android:text="+"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&Button android:id="@+id/cancel" &&&&&&&&&&&& android:text="C"&&&&&&&&&&&& android:textColor="#ffff0000"&&&&&&&&&&&&&&&&android:layout_width="63sp"&&&&&&&&&&&&&&&&android:layout_height="wrap_content" /&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&& &&&& &&&&&&&&&&&&&&&& &&&& &&&&&&&&&/TableRow&&&&& &&&&&&&&&&&& &&&&&&&&&&&&&/TableLayout&&&&&&&&&&/LinearLayout&
阅读(2911) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。Android UI布局 - 简书
Android UI布局
一、线性布局-LinearLayout(至上而下布局)
其中android:orientation=”vertical”意思为垂直方向的线性布局,此处的”vertical”可改为”horizontal”,意思是水平方向的线性布局。android:layout_width=”match_parent”意思为这个控件的宽度占满整个屏幕或者父控件,此处的”match_parent”可改为”wrap_parant”,意思是宽度刚好包含住LinearLayout里面的内容。常用布局控件:android:id为控件指定相应的IDandroid:text指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串android:gravity控制这个一个控件的位置,比如居中、靠右、底部、上部等android:textSize指定控件当中字体的大小android:background指定该控件所使用的背景色,RGB命名法android:layout_weight数值为几即该控件占满整个屏幕的数值合之几,比如当前Activity中有2个控件,第一个控件是android:layout_weight=”2″,第二个控件是android:layout_weight=”3″,则,第一个控件占整个屏幕的3/5。android:height指定控件的高度android:padding*指定控件的内边距,也就是说控件当中的内容,如android:paddingLeft=”10dip”、android:paddingRight=”10dip”等等。也可以直接android:padding=”10dip”意思是说内边距4面距离都为10.android:singleLine如果设置为真的话,则将控件的所有内容在同一行当中进行显示二、表格布局-TableLayout概述:TableLayout多用于列表的显示1、把子元素放到行与列中。2、不显示行、列和单元格的边界线。3、单元格不能横跨行,类似于html。
//这一条语句的意思是:是设置 TableLayout所有行的第二列为拉伸列。也就是说如果每行都有三列的话,剩余的空间由第二列补齐。为0时则是第一列为拉伸列。目的是为了把父控件填满。三、嵌套布局即多个布局嵌套使用。
如要实现以下布局:即多个LinearLayout嵌套//需要注意的是嵌套的LinearLayout权重都是1,即各自占屏幕的一半。四、相对布局-RelativeLayout概念:类似于CSS+DIV布局。一个控件的位置,决定于他和周围控件的关系。与其他控件的区别:相对布局是依赖与和周围控件的关系而决定为位置的,如将A控件放在B控件的下方。其中以下属性在实际应用中可能经常用到android:layout_above将该控件的底部至于给定ID的控件之上android:layout_below将该控件的顶部至于给定ID的控件之下android:layout_toLeftOf将该控件的右边缘和给定ID的控件的左边缘对齐android:layout_toRightOf将该控件的左边缘和给定ID的控件的右边缘对齐android:layout_alignBaseline该控件的baseline和给定ID的控件的baseline对齐android:layout_alignBottom将该控件的底部边缘与给定ID控件的底部边缘android:layout_alignLeft将该控件的左边缘与给定ID控件的左边缘对齐android:layout_alignRight将该控件的右边缘与给定ID控件的右边缘对齐android:layout_alignTop将给定控件的顶部边缘与给定ID控件的顶部对齐android:layout_alignParentBottom如果该值为true,则将该控件的底部和父控件的底部对齐android:layout_alignParentLeft如果该值为true,则将该控件的左边与父控件的左边对齐android:layout_alignParentRight如果该值为true,则将该控件的右边与父控件的右边对齐android:layout_alignParentTop如果该值为true,则将控件的顶部与父控件的顶部对齐android:layout_centerHorizontal如果值为真,该控件将被至于水平方向的中央android:layout_centerInParent如果值为真,该控件将被至于父控件水平方向和垂直方向的中央android:layout_centerVertical如果值为真,该控件将被至于垂直方向的中央通俗的理解 Padding 为内边框,Margin 为外边框对应的属性为android:layout_marginBottom=”25dip”android:layout_marginLeft=”10dip”android:layout_marginTop=”10dip”android:layout_marginRight=”10dip”android:paddingLeft=”1dip”android:paddingTop=”1dip”android:paddingRight=”1dip”android:paddingBottom=”1dip”如果左右上下都是相同的设置则可以直接设置android:layout_margin=”10dip”android:padding=”5dip”四、帧布局和网格布局-FrameLayout & GridLayoutFrameLayout帧布局,在这种布局下,每个添加的子控件都被放在布局的左上角,并覆盖在前一个子控件的上层;此外,FrameLayout中的子控件的位置不能被指定。GridLayout网格布局,自Android4.0版本(API level 14)后,新增的网格布局。注意:如果要达到网格的效果,推荐使用LinearLayout来实现,因为使用GridLayout会产生如下问题:不能同时在(x,y)轴方向上进行控件的对齐;当多层布局嵌套的时候会出现性能问题;不能稳定地支持一些支持自由编辑布局的工具。计算器界面用GridLayout和Button模仿了一个计算器的按键界面。
gridlayout_calculator.jpg布局源码文/Ruj(简书作者)原文链接:/p/4f0a7d319c89著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。文/Ruj(简书作者)原文链接:/p/4f0a7d319c89著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。IOS用MyLinearLayout实现自动适应布局详细教程-ios8-手机开发-壹聚教程网IOS用MyLinearLayout实现自动适应布局详细教程
随着iphone手机的升级,屏幕越来越大,对于IOS开发者来说不得不考虑自适应布局,本文我们介绍一个ios自适应布局类MyLinearLayout,他可以解决我们很多烦恼。
MyLinearLayout基本功能介绍MyLinearLayout的实现充分参考了Android中的LinearLayout布局,但是却比LinearLayout更为强大,他几乎可以实现AutoLayout的所有功能甚至其不具备的功能。MyLinearLayout是一个基于流式布局的容器视图,我们只需要把子视图添加到MyLinearLayout中,并设置一些简单的约束参数那么就可以完成各种布局的要求了,而且后续中只要子视图的位置和大小进行变化都会触发容器视图里面的子视图进行重新布局。我先简单的对MyLinearLayout里面的属性和函数进行介绍,然后我们再实现一些布局的场景的代码的实现。MyLinearLayout既可以用于编码实现有可以用在XIB中使用,但是在XIB中使用时请把AutoLayout的支持去掉,因为MyLinearLayout不是基于自动布局的。在介绍MyLinearLayout之前,我们先要对视图扩展出一些属性,这些属性只用于MyLinearLayout中。我会在后面一一介绍这些属性以及用法。@interface UIView(LayoutExt)//下面4个属性用于指定视图跟他相关视图之间的间距,如果为0则是没有间距,如果&0 &1则是相对间距,是按父视图的比例算的,比如父视图是100,而左间距是0.1则值是10。如果大于等于1则是绝对间距//一般当使用相对间距时主要用图是子视图的宽度和高度是固定的,只是边距随父视图的大小而调整。@property(nonatomic,assign)CGFloat topM@property(nonatomic,assign)CGFloat leftM@property(nonatomic,assign)CGFloat bottomM@property(nonatomic,assign)CGFloat rightM@property(nonatomic,assign)UIEdgeI//上面四个边距//用于指定边距的停靠位置,也就是在父视图中的停靠策略,如果设置为MGRAVITY_NONE则不使用停靠策略而是使用frame中x,y来定位视图的位置。@property(nonatomic,assign)MarignGravity marginG//视图的相对尺寸,如果为0则视图使用绝对的高度或宽度。值的范围是0-1表示自身的高度或者宽度是父视图高度和宽度的百分比,如果是1则表示和父视图是一样的高度和宽度//如果为负数则表示子视图离父视图的两边的边距。@property(nonatomic,assign)CGFloat matchParentW@property(nonatomic,assign)CGFloat matchParentH//设定视图的高度在宽度是固定的情况下根据内容的大小而浮动,如果内容无法容纳的话则自动拉升视图的高度,如果原始高度高于内容则会缩小视图的高度。默认为NO,这个属性主要用UILabel,UITextView的多行的情况。@property(nonatomic,assign,getter=isFlexedHeight)BOOL flexedH@end@interface UIView(LinearLayoutExtra)//比重,指定自定的高度或者宽度在父视图的比重。取值为&=0 &=1,这个特性用于平均分配高宽度或者按比例分配高宽度@property(nonatomic,assign)CGF@end这些属性只用在MyLinearLayout中和MyFrameLayout(框架布局,请浏览我的另外一篇文章)中才有意义。如果我们在XIB中进行布局的话我们可以在自定义数据设置界面指定这些属性。接下来我们在介绍MyLinearLayout的定义,对于流式布局来说简单点就是从上到下或者从左到右,因此我们定义了垂直布局和水平布局两种样式。//布局排列的方向typedefenum : NSUInteger {&&& LVORIENTATION_VERT,&&& LVORIENTATION_HORZ,} LineViewO以及MyLinearLayout的属性:@property(nonatomic,assign)LineViewOri&&&&&&&&&&&&&& orientation =& LVORIENTATION_VERT&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& orientation =& LVORIENTATION_HORZ& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 因为垂直布局和水平布局的实现都是一样的,下面的例子我都将以垂直布局进行举例,同时在没有特殊说明的情况下我会把MyLinearLayout的背景设置为灰色。一、子视图间距设置以及自动调整大小的属性&&&&& 要实现上面的布局需要键入下面的代码:&&& //默认高宽为200,200 &&&&&&&& MyLinearLayout *ll = [[MyLinearLayout alloc] initWithFrame:CGRectMake(0, 0, 200,200)]; &&&&&&&& ll.orientation = LVORIENTATION_VERT; &&&&&&&& ll.backgroundColor = [UIColor grayColor]; &&&&&&&&& &&&&&&&& //不再需要指定y的偏移值了。 &&&&&&&& UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(20, 0, 120, 40)]; &&&&&&&& v1.backgroundColor = [UIColor redColor]; &&&&&&&& v1.topMargin = 4; &&&&&&&& [ll addSubview:v1]; &&&&&&&&& &&&&&&&& UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(40, 0, 80, 60)]; &&&&&&&& v2.backgroundColor = [UIColor greenColor]; &&&&&&&& v2.topMargin = 6; &&&&&&&& [ll addSubview:v2]; &&&&& &&&&&&&&& &&&&&&&& UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(30, 0, 150, 30)]; &&&&&&&& v3.backgroundColor = [UIColor blueColor]; &&&&&&&& v3.topMargin = 3; &&&&&&&& v3.bottomMargin = 4; &&&&&&&& [ll addSubview:v3]; &&&&& &&&&&&&& [self.view addSubview:ll]; &上面的代码中实现了垂直布局的代码,在这段代码中我们发现v1,v2,v3的frame中x,y值部分不需要指定和计算了,都默认设置为0,而改用topMargin和bottomMargin,leftMargin和rightMargin来指定视图之间的间距,这样一个好处是当某个子视图的高度变化时布局会自动重新进行子视图位置的排列,而不要手动进行调整。 同时可以发现虽然MyLinearLayout的高度设置为200,但实际高度确是147,这是怎么回事呢? 这是因为MyLinearLayout中有一个属性:@property(nonatomic,assign,getter =isAutoAdjustSize)BOOL autoAdjustS这个属性的默认值是YES表示布局的高度会根据里面子视图的整体高度而调整,如果所有子视图的高度大于线性布局的高度时则会扩充布局的高度,而如果小于布局的高度时则布局的高度会缩小,如果autoAdjustSize设置为NO时则布局的高度是会保持不变的,也就是不会随着子视图的整体高度而调整。既然线性布局的高度会调整,那么这个高度的调整时我们还可以指出高度调整时线性布局本身的位置是否需要移动,因此我们还可以指定另外一个属性:@property(nonatomic,assign)LineViewAutoAdjustDir autoAdjustD这个属性是指定当线性布局的高度调整时位置伸缩的方向,这个值可以有如下的值://调整大小时伸缩的方向typedefenum : NSUInteger {&&& LVAUTOADJUSTDIR_TAIL,& //头部固定尾部伸缩&&& LVAUTOADJUSTDIR_CENTER,//中间固定头尾伸缩&&& LVAUTOADJUSTDIR_HEAD,& //尾部固定头部伸缩}LineViewAutoAdjustD下面的截图分别说明了autoAdjustSize为NO时,以及为YES时的autoAdjustDir的不同值的结果:代码如下:&&& -(UIView*)createView:(BOOL)autoAdjustSize autoAdjustDir:(LineViewAutoAdjustDir)autoAdjustDir &&&& { &&&&&&&& MyLinearLayout *ll = [[MyLinearLayout alloc] initWithFrame:CGRectMake(0, 0, 100,200)]; &&&&&&&& ll.leftMargin = 10; &&&&&&&& ll.orientation = LVORIENTATION_VERT; &&&&&&&& ll.autoAdjustSize = autoAdjustS &&&&&&&& ll.autoAdjustDir = autoAdjustD &&&&&&&& ll.backgroundColor = [UIColor grayColor]; &&&&&&&&& &&&&&&&& //不再需要指定y的偏移值了。 &&&&&&&& UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 60, 40)]; &&&&&&&& v1.backgroundColor = [UIColor redColor]; &&&&&&&& v1.topMargin = 4; &&&&&&&& v1.leftMargin = 10; &&&&&&&& [ll addSubview:v1]; &&&&&&&&& &&&&&&&& UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 60)]; &&&&&&&& v2.backgroundColor = [UIColor greenColor]; &&&&&&&& v2.topMargin = 6; &&&&&&&& v2.leftMargin = 20; &&&&&&&& [ll addSubview:v2]; &&&&&&&&& &&&&&&&&& &&&&&&&& UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 75, 30)]; &&&&&&&& v3.backgroundColor = [UIColor blueColor]; &&&&&&&& v3.topMargin = 3; &&&&&&&& v3.bottomMargin = 4; &&&&&&&& v3.leftMargin = 15; &&&&&&&& [ll addSubview:v3]; &&&&&&&&& &&&&&&&& &&&& } &&&&& &&&& -(void)loadView &&&& { &&&&&&&& self.view = [MyFrameLayout new]; &&&&&&&&& &&&&&&&& MyLinearLayout *test1ll = [MyLinearLayout new]; &&&&&&&& test1ll.orientation = LVORIENTATION_HORZ; //水平布局 &&&&&&&& test1ll.marginGravity = MGRAVITY_CENTER;& //本视图在父视图中居中 &&&&&&&& test1ll.gravity = MGRAVITY_HORZ_CENTER;&& //本视图里面的所有子视图整体水平居中停靠 &&&&&&&& test1ll.wrapContent = YES;& //本视图的高度由子视图中最高的决定。 &&&&&&&& [self.view addSubview:test1ll]; &&&&&&&&& &&&&&&&& //标尺视图 &&&&&&&& UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 200)]; &&&&&&&& v.backgroundColor = [UIColor blackColor]; &&&&&&&& v.leftMargin = 10; &&&&&&&& [test1ll addSubview:v]; &&&&&&&&& &&&&&&&& [test1ll addSubview:[self createView:NO autoAdjustDir:LVAUTOADJUSTDIR_TAIL]]; &&&&&&&& [test1ll addSubview:[self createView:YES autoAdjustDir:LVAUTOADJUSTDIR_TAIL]]; &&&&&&&& [test1ll addSubview:[self createView:YES autoAdjustDir:LVAUTOADJUSTDIR_CENTER]]; &&&&&&&& [test1ll addSubview:[self createView:YES autoAdjustDir:LVAUTOADJUSTDIR_HEAD]]; &&&&& &&&& } &二、布局里面子视图的隐藏显示以及对UIScrollView的支持。&&&& 有时候有一些场景中,当某个或者某几个视图隐藏时,我们希望下面的视图能够自动往上移动以便填补空白,而当某个视图再次显示时下面的视图又再次往下移动,很幸运! MyLinearLayout是支持这种情况的(视图必须是MyLinearLayout的直接子视图才可以),具体例子请大家自行实验。另外因为我们有autoAdjustSize属性,因此我们可以把线性布局放入到一个ScrollView中(这又有点像android中的scrollview的方式)。并且线性布局提供一个属性:@property(nonatomic,assign,getter = isAdjustScrollViewContentSize)BOOL adjustScrollViewContentS这个属性是指当某个线性布局放入到ScrollView中时,可以指定是否当自己的高度调整时,是否也会自动调整父视图ScrollView的contentSize值,这个属性的值默认是NO,如果设置为YES时也只有父视图是ScrollView才有效。这段代码如下:&&& -(void)loadView &&&& { &&&&&&&& UIScrollView *scrollView = [UIScrollView new]; &&&&&&&& self.view = scrollV &&&&&&&&& &&&&&&&& MyLinearLayout *ll = [MyLinearLayout new]; &&&&&&&& ll.backgroundColor = [UIColor grayColor]; &&&&&&&& ll.padding = UIEdgeInsetsMake(10, 10, 10, 10); &&&&&&&& ll.matchParentWidth = 1; //宽度和UIScrollView保持一致 &&&&&&&& ll.adjustScrollViewContentSize = YES; &&&&&&&&& &&&&&&&& UILabel *label = [UILabel new]; &&&&&&&& label.matchParentWidth = 1; &&&&&&&& label.flexedHeight = YES;& //这个属性会控制在固定宽度下自动调整视图的高度。 &&&&&&&& label.numberOfLines = 0; &&&&&&&& label.backgroundColor = [UIColor blueColor]; &&&&&&&& label.text = @&这是一段可以隐藏的字符串,点击下面的按钮就可以实现文本的显示和隐藏,同时可以支持根据文字内容动态调整高度,这需要把flexedHeight设置为YES&; &&&&&&&& [ll addSubview:label]; &&&&&&&&& &&&&&&&& UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 0, 60)]; &&&&&&&& btn.matchParentWidth = 1; &&&&&&&& [btn setTitle:@&点击按钮显示隐藏文本& forState:UIControlStateNormal]; &&&&&&&& [btn addTarget:self action:@or(handleLabelShow:) forControlEvents:UIControlEventTouchUpInside]; &&&&&&&& [ll addSubview:btn]; &&&&&&&&& &&&&&&&& UIView *bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 400)]; &&&&&&&& bottomView.backgroundColor = [UIColor greenColor]; &&&&&&&& bottomView.matchParentWidth = 1; &&&&&&&& [ll addSubview:bottomView]; &&&&&&&&& &&&&&&&&& &&&&& &&&&&&&&& &&&&&&&& [self.view addSubview:ll]; &&&&&&&&& &&&&&&&&& &&&& } &&&&& &&&& -(void)handleLabelShow:(UIButton*)sender &&&& { &&&&&&&&& &&&&&&&& UIView *supv = sender. &&&&&&&& NSArray *arr = supv. &&&&&&&&& &&&&&&&& UILabel *lab = [arr objectAtIndex:0]; &&&&&&&&& &&&&&&&& if (lab.isHidden) &&&&&&&&&&&& lab.hidden = NO; &&&&&&&& else &&&&&&&&&&&& lab.hidden = YES; &&&& } &从代码中我们可以看出当我们要隐藏和显示某个子视图时直接设置子视图隐藏和取消隐藏而不需要再编码来调整整个视图的高度,不需要编码来移动下面兄弟视图的位置,不需要编码来调整父UIScrollView的contentSize来调整高度,我们还可以看到UIScrollView下只需要添加一个布局视图,同时我们还指定了布局视图的宽度和UIScrollView是保持一致的。同时我们还看到了UILabel中使用了扩展属性flexedHeight,这个属性设置为YES时,系统会在布局时自动根据指定的宽度来调整自己的高度,从而多行显示完所有的内容,这个属性非常的强大。三、布局内视图位置的停靠以及布局的内部边距设定以及子视图大小的指定&&& 上面的例子中所有子视图的frame的x都是指定的一个常量值,也就是在垂直布局中子视图的左右位置是可以自己定义的,但有时候我们希望布局里面的所有子视图的位置都是固定的,比如所有子视图左对齐,或者居中对齐,或者居右对齐。这时候我们就需要用到布局中的如下属性了:@property(nonatomic,assign)MarignG这个属性用于指定布局中的所有子视图的停靠位置,一共有如下的定义:&&& MGRAVITY_NONE&& //不使用停靠而是靠frame.origin.x,y的值来进行定位&&& MGRAVITY_HORZ_LEFT& //水平居左停靠&&& MGRAVITY_HORZ_CENTER& // 水平居中停靠&&& MGRAVITY_HORZ_RIGHT&& //水平居右停靠&&& MGRAVITY_HORZ_FILL&& //水平填充&&& MGRAVITY_VERT_TOP&&& //垂直居顶停靠&&& MGRAVITY_VERT_CENTER& //垂直居中停靠&&& MGRAVITY_VERT_BOTTOM& //垂直居低停靠&&& MGRAVITY_VERT_FILL&& //垂直填充&&& MGRAVITY_CENTER&&&&& //居中&&& MGRAVITY_FILL&&&&&& //填充这些定义中当gravity为MGRAVITY_NONE时则表明不使用停靠策略,也就是按子视图中的marginGravity属性中指定的停靠策略或者用frame的orign.x的值来决定(或者orign.y)。子视图中的marginGravity用来指定子视图自身的停靠策略,视图的取值也是MarginGravity,比如有一些场景中我们希望所有的子视图都左边对齐,那么我们可以设置布局视图的gravity的值为:MGRAVITY_HORZ_LEFT。而有时候我们又希望布局中的部分子视图左边对齐,部分右边对齐则我们不需要设置布局视图的gravity值而是分别对每个子视图的marginGravity值进行设定。有时候我们希望布局里面的所有子视图都跟布局保持一定的间距,这时候我们就可以用如下的属性:@property(nonatomic,assign)UIEdgeI //用来描述里面的子视图的离自己的边距,默认上下左右都是0//这个是上面属性的简化设置版本。@property(nonatomic,assign)CGFloat topP@property(nonatomic,assign)CGFloat leftP@property(nonatomic,assign)CGFloat bottomP@property(nonatomic,assign)CGFloat rightPpadding属性用来描述里面的所有子视图跟自己保持的边界距离。下面代码显示了垂直布局中的左中右三种停靠方式,以及四周的边距都设置为5,看代码你会发现frame中的x的值已经不起作用了,这样是不是进一步的简化了编码?&&& -(UIView*)createView:(MarignGravity)gravity padding:(UIEdgeInsets)padding &&&& { &&&&&&&& MyLinearLayout *ll = [[MyLinearLayout alloc] initWithFrame:CGRectMake(0, 0, 100,200)]; &&&&&&&& ll.leftMargin = 10; &&&&&&&& ll.orientation = LVORIENTATION_VERT; &&&&&&&& ll.gravity = &&&&&&&& ll.padding = &&&&&&&& ll.backgroundColor = [UIColor grayColor]; &&&&&&&&& &&&&&&&& //不再需要指定y的偏移值了。 &&&&&&&& UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 60, 40)]; &&&&&&&& v1.backgroundColor = [UIColor redColor]; &&&&&&&& v1.topMargin = 4; &&&&&&&& [ll addSubview:v1]; &&&&&&&&& &&&&&&&& UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 60)]; &&&&&&&& v2.backgroundColor = [UIColor greenColor]; &&&&&&&& v2.topMargin = 6; &&&&&&&& [ll addSubview:v2]; &&&&&&&&& &&&&&&&&& &&&&&&&& UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 75, 30)]; &&&&&&&& v3.backgroundColor = [UIColor blueColor]; &&&&&&&& v3.topMargin = 3; &&&&&&&& v3.bottomMargin = 4; &&&&&&&& [ll addSubview:v3]; &&&&&&&&& &&&&&&&& &&&&&&&&& &&&& } &&&&& &&&&& &&&&& &&&& -(void)loadView &&&& { &&&&&&&& self.view = [MyFrameLayout new]; &&&&&&&&& &&&&&&&& MyLinearLayout *test1ll = [MyLinearLayout new]; &&&&&&&& test1ll.orientation = LVORIENTATION_HORZ; //水平布局 &&&&&&&& test1ll.marginGravity = MGRAVITY_CENTER;& //本视图在父视图中居中 &&&&&&&& test1ll.gravity = MGRAVITY_HORZ_CENTER;&& //本视图里面的所有子视图整体水平居中停靠 &&&&&&&& test1ll.wrapContent = YES;& //本视图的高度由子视图中最高的决定。 &&&&&&&& [self.view addSubview:test1ll]; &&&&&&&&& &&&&&&&& [test1ll addSubview:[self createView:MGRAVITY_HORZ_LEFT padding:UIEdgeInsetsMake(5, 5, 5, 5)]]; &&&&&&&& [test1ll addSubview:[self createView:MGRAVITY_HORZ_CENTER padding:UIEdgeInsetsMake(5, 5, 5, 5)]]; &&&&&&&& [test1ll addSubview:[self createView:MGRAVITY_HORZ_RIGHT padding:UIEdgeInsetsMake(5, 5, 5, 5)]]; &&&&&&&&& &&&& } &上面的视图中我们可以通过为布局视图设置gravity的值来调整里面所有子视图的左右方向的停靠位置,同样我们也可以通过设置布局视图的gravity的值来调整所有子视图上下方向的停靠位置,见下面的图片:代码如下:&&& -(UIView*)createView:(MarignGravity)gravity &&&& { &&&&&&&& MyLinearLayout *ll = [[MyLinearLayout alloc] initWithFrame:CGRectMake(0, 0, 100,200)]; &&&&&&&& ll.leftMargin = 10; &&&&&&&& ll.orientation = LVORIENTATION_VERT; &&&&&&&& ll.gravity = &&&&&&&& ll.backgroundColor = [UIColor grayColor]; &&&&&&&&& &&&&&&&& UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 40)]; &&&&&&&& v1.backgroundColor = [UIColor redColor]; &&&&&&&& v1.topMargin = 4; &&&&&&&& v1.matchParentWidth = 1.0; &&&&&&&& [ll addSubview:v1]; &&&&&&&&& &&&&&&&& UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 60)]; &&&&&&&& v2.backgroundColor = [UIColor greenColor]; &&&&&&&& v2.topMargin = 6; &&&&&&&& [ll addSubview:v2]; &&&&&&&&& &&&&&&&&& &&&&&&&& UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 75, 30)]; &&&&&&&& v3.backgroundColor = [UIColor blueColor]; &&&&&&&& v3.topMargin = 3; &&&&&&&& v3.bottomMargin = 4; &&&&&&&& [ll addSubview:v3]; &&&&&&&&& &&&&&&&& &&&&&&&&& &&&&&&&&& &&&& } &&&&& &&&& -(void)loadView &&&& { &&&&&&&& self.view = [MyFrameLayout new]; &&&&&&&&& &&&&&&&& MyLinearLayout *test1ll = [MyLinearLayout new]; &&&&&&&& test1ll.orientation = LVORIENTATION_HORZ; //水平布局 &&&&&&&& test1ll.marginGravity = MGRAVITY_CENTER;& //本视图在父视图中居中 &&&&&&&& test1ll.gravity = MGRAVITY_HORZ_CENTER;&& //本视图里面的所有子视图整体水平居中停靠 &&&&&&&& test1ll.wrapContent = YES;& //本视图的高度由子视图中最高的决定。 &&&&&&&& [self.view addSubview:test1ll]; &&&&&&&&& &&&&&&&& [test1ll addSubview:[self createView:MGRAVITY_VERT_TOP]]; &&&&&&&& [test1ll addSubview:[self createView:MGRAVITY_VERT_CENTER]]; &&&&&&&& [test1ll addSubview:[self createView:MGRAVITY_VERT_BOTTOM]]; &&&& } &从上面两段代码中我们可以通过gravity的值来设置布局视图内的所有视图的停靠方式,但是有的时候我们不希望由布局视图来统一控制停靠的方向(对于垂直布局的话是指左右方向,对于水平布局的话是指上下方向),而是希望由子视图自生来控制停靠的位置,这时候我们就需要使用子视图的扩展属性marginGravity以及xxxMargin这几个扩展属性来进行处理了,使用子视图自己设定的停靠位置,要求布局视图的gravity的在某个方向上的停靠值未被设定,也就是说如果子视图想自己调整左右位置则布局视图的gravity的水平方向的停靠必须设置为MGRAVITY_NONE.代码如下:&&& -(UIView*)createView &&&& { &&&&&&&& MyLinearLayout *ll = [[MyLinearLayout alloc] initWithFrame:CGRectMake(0, 0, 100,200)]; &&&&&&&& ll.leftMargin = 10; &&&&&&&& ll.orientation = LVORIENTATION_VERT; &&&&&&&& ll.backgroundColor = [UIColor grayColor]; &&&&&&&&& &&&&&&&& //不再需要指定y的偏移值了。 &&&&&&&& UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 60, 40)]; &&&&&&&& v1.backgroundColor = [UIColor redColor]; &&&&&&&& v1.topMargin = 4; &&&&&&&& v1.marginGravity = MGRAVITY_HORZ_LEFT; &&&&&&&& [ll addSubview:v1]; &&&&&&&&& &&&&&&&& UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 60)]; &&&&&&&& v2.backgroundColor = [UIColor greenColor]; &&&&&&&& v2.topMargin = 6; &&&&&&&& v2.marginGravity = MGRAVITY_HORZ_CENTER; &&&&&&&& [ll addSubview:v2]; &&&&&&&&& &&&&&&&&& &&&&&&&& UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 75, 30)]; &&&&&&&& v3.backgroundColor = [UIColor blueColor]; &&&&&&&& v3.topMargin = 3; &&&&&&&& v3.marginGravity = MGRAVITY_HORZ_RIGHT; &&&&&&&& [ll addSubview:v3]; &&&&&&&&& &&&&&&&& UIView *v4 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 75, 30)]; &&&&&&&& v4.backgroundColor = [UIColor yellowColor]; &&&&&&&& v4.topMargin = 3; &&&&&&&& v4.bottomMargin = 4; &&&&&&&& v4.marginGravity = MGRAVITY_HORZ_RIGHT; &&&&&&&& v4.rightMargin = 10; &&&&&&&& [ll addSubview:v4]; &&&&&&&&& &&&&&&&&& &&&&&&&&& &&&&&&&& &&&&&&&&& &&&& } &&&&& &&&& -(void)loadView &&&& { &&&&&&&&& &&&&&&&& self.view = [MyFrameLayout new]; &&&&&&&&& &&&&&&&& MyLinearLayout *test1ll = [MyLinearLayout new]; &&&&&&&& test1ll.orientation = LVORIENTATION_HORZ; //水平布局 &&&&&&&& test1ll.marginGravity = MGRAVITY_CENTER;& //本视图在父视图中居中 &&&&&&&& test1ll.gravity = MGRAVITY_HORZ_CENTER;&& //本视图里面的所有子视图整体水平居中停靠 &&&&&&&& test1ll.wrapContent = YES;& //本视图的高度由子视图中最高的决定。 &&&&&&&& [self.view addSubview:test1ll]; &&&&&&&&& &&&&&&&& [test1ll addSubview:[self createView]]; &&&& } &上面的子视图通过自身的marginGravity值来确定自己在父视图中的停靠位置,注意一下v3,v4都是右边停靠,但是v4的右边多出了一个rightMargin值。&在布局时,有时候子视图的宽度(如果是水平布局时则是高度)是由布局视图决定的,比如某个子视图的宽度和布局视图一样宽,或者某个子视图是布局视图宽度的80%,子视图于父视图的左右间距设置为20,这时候就需要引入子视图的一个扩展属性了(见上面的子视图的扩展属性)://视图的相对尺寸,如果为0则视图使用绝对的高度或宽度。值的范围是0-1表示自身的高度或者宽度是父视图高度和宽度的百分比,如果是1则表示和父视图是一样的高度和宽度//如果为负数则表示子视图离父视图的两边的边距。@property(nonatomic,assign)CGFloat matchParentW@property(nonatomic,assign)CGFloat matchParentH这两个属性既可以用于布局里面的子视图,也可以用于布局视图本身,用于布局视图本身的情况下我们可以让布局的宽度和高度和布局的父视图保持一致。而不需要手动指定布局的宽度和高度,如果是为布局视图设置这个参数的话,请在将布局视图加入非布局视图之前设置。&&& 下面例子中,我们把红色子视图的宽度分别设置为跟布局一样宽,80%,以及两边边距为20的例子(需要注意的是如果有padding则是会扣除padding后的值),代码中红色子视图部分的frame的width的值将被设置为0,取而代之的是matchParentWidth的设置。代码如下:&&& -(UIView*)createView &&&& { &&&&&&&& MyLinearLayout *ll = [[MyLinearLayout alloc] initWithFrame:CGRectMake(0, 0, 100,200)]; &&&&&&&& ll.orientation = LVORIENTATION_VERT; &&&&&&&& ll.backgroundColor = [UIColor grayColor]; &&&&&&&&& &&&&&&&& UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 40)]; &&&&&&&& v1.backgroundColor = [UIColor redColor]; &&&&&&&& v1.topMargin = 4; &&&&&&&& v1.matchParentWidth = 1.0; &&&&&&&& [ll addSubview:v1]; &&&&&&&&& &&&&&&&& UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 60)]; &&&&&&&& v2.backgroundColor = [UIColor greenColor]; &&&&&&&& v2.topMargin = 6; &&&&&&&& v2.matchParentWidth = 0.8; &&&&&&&& [ll addSubview:v2]; &&&&&&&&& &&&&&&&&& &&&&&&&& UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 30)]; &&&&&&&& v3.backgroundColor = [UIColor blueColor]; &&&&&&&& v3.topMargin = 3; &&&&&&&& v3.matchParentWidth = -20; &&&&&&&& [ll addSubview:v3]; &&&&&&&&& &&&&&&&& UIView *v4 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 30)]; &&&&&&&& v4.backgroundColor = [UIColor yellowColor]; &&&&&&&& v4.topMargin = 3; &&&&&&&& v4.bottomMargin = 4; &&&&&&&& v4.matchParentWidth = 1; &&&&&&&& v4.leftMargin = 10; &&&&&&&& v4.rightMargin = 30; &&&&&&&& [ll addSubview:v4]; &&&&&&&&& &&&&&&&&& &&&&&&&&& &&&&&&&& &&&&&&&&& &&&& } &&&&& &&&&& &&&& -(void)loadView &&&& { &&&&&&&&& &&&&&&&& self.view = [MyFrameLayout new]; &&&&&&&&& &&&&&&&& MyLinearLayout *test1ll = [MyLinearLayout new]; &&&&&&&& test1ll.orientation = LVORIENTATION_HORZ; //水平布局 &&&&&&&& test1ll.marginGravity = MGRAVITY_CENTER;& //本视图在父视图中居中 &&&&&&&& test1ll.gravity = MGRAVITY_HORZ_CENTER;&& //本视图里面的所有子视图整体水平居中停靠 &&&&&&&& test1ll.wrapContent = YES;& //本视图的高度由子视图中最高的决定。 &&&&&&&& [self.view addSubview:test1ll]; &&&&&&&&& &&&&&&&& [test1ll addSubview:[self createView]]; &&&& } &代码中我们看到第4个视图虽然是设置了matchParentWidth = 1,但是因为又设置了leftMargin,rightMargin,所以整个子视图的宽度也就是相应的缩小了。四、终极武器1:子视图的相对尺寸,以及布局视图的尺寸,复杂布局的处理。&&&&& 在某些时候,我们知道了布局视图的高度的情况下,想平分里面所有子视图的高度,或者里面的子视图的高度我们只需要指定相对值而不需要指定绝对值,如果我们想在布局视图里面增加2个视图,其中一个视图占用布局视图的40%,而另外一个视图占用60%。因为如果支持子视图的相对高度的话,那么当布局视图进行缩放或者进行旋转时里面的子视图都会按照指定比例进行缩放,这时候我们需要用到上面视图的一个强大的扩展属性:weight了:@property(nonatomic,assign)CGF这个视图的扩展属性的设置的范围是0到1表示子视图本身在布局视图中所占用的高度或者宽度的比例,下面我们来实现一个自动布局里面一个最经典的需求:& 每个视图的间距都为20,分为上下2个部分,各占用50%,上面的2个视图各占用50%。&&& -(void)loadView &&&& { &&&&&&&& MyLinearLayout *ll = [MyLinearLayout new]; &&&&&&&& //保证容器和视图控制的视图的大小进行伸缩调整。 &&&&&&&& ll.autoresizingMask =& UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleH &&&&&&&& ll.orientation = LVORIENTATION_VERT; &&&&&&&& ll.padding = UIEdgeInsetsMake(20, 20, 20, 20); &&&&&&&& ll.backgroundColor = [UIColor grayColor]; &&&&&&&&& &&&&&&&& MyLinearLayout *topll = MyLinearLayout. &&&&&&&& topll.orientation = LVORIENTATION_HORZ; &&&&&&&& topll.weight = 0.5; &&&&&&&& topll.matchParentWidth = 1; &&&&&&&&& &&&&&&&& UIView *topLeft = UIView. &&&&&&&& topLeft.backgroundColor = [UIColor redColor]; &&&&&&&& topLeft.weight = 0.5; &&&&&&&& topLeft.matchParentHeight = 1.0; &&&&&&&& [topll addSubview:topLeft]; &&&&&&&&& &&&&&&&& UIView *topRight = UIView. &&&&&&&& topRight.backgroundColor = [UIColor greenColor]; &&&&&&&& topRight.weight = 0.5; &&&&&&&& topRight.matchParentHeight = 1.0; &&&&&&&& topRight.leftMargin = 20; &&&&&&&& [topll addSubview:topRight]; &&&&&&&&& &&&&&&&& [ll addSubview:topll]; &&&&&&&&& &&&&&&&&& &&&&&&&& UIView *bottom = UIView. &&&&&&&& bottom.backgroundColor = [UIColor blueColor]; &&&&&&&& bottom.weight = 0.5; &&&&&&&& bottom.matchParentWidth = 1.0; &&&&&&&& bottom.topMargin = 20; &&&&&&&& [ll addSubview:bottom]; &&&&&&&&& &&&&&&&&& &&&&&&&& self.view = &&&&& &&&& } &从上面的代码可以看出,其中没有使用到任何绝对的位置和大小的数字,都是相对值,为了支持复杂的布局我们使用了MyLinearLayout的嵌套的方式来解决问题。通过为子视图的weight的指定我们可以很灵活的对布局里面的子视图的高度进行设置,一个布局中我们可以设置某些子视图的绝对高度,也可以设置另外一些子视图的weight。比如:1.某个线性布局有3个子视图,并且顶部和底部的视图的高度都是固定的,而中间的视图则占用布局的剩余高度则可以如下设置:&v1.frame& = CGRectMake(x,0,x, 30)&v2.frame = CGRectZero&v2.weight = 1.0&v3.frame& = CGRectMake(x,0,x,50)2.某个线性布局有3个子视图,顶部的视图高度固定的,而底部两个视图则按剩下的高度的4:6来进行分配则可以设置如下:&v1.frame& = CGRectMake(x,0,x, 30)&v2.frame = CGRectZero&v2.weight = 0.4&v3.frame = CGRectZero&v3.weight = 0.6五、终极武器2:布局视图的高度和宽度完全由子视图来控制。&&&& 在垂直布局中,我们知道布局的高度可以由所有子视图动态调整,那么宽度是否也可以由子视图来决定呢?这是可以了!!当布局中某个子视图的宽度是确定的,我么可以选择由子视图里面最宽的那个视图来决定布局视图的宽度。 视图的一个扩展属性matchParentXXX的概念就类似于android中的match_parent的值,而布局中的属性wrapContent则类似于android的wrap_content的值:@property(nonatomic,assign)BOOL wrapC这个属性的的意义是用于指定布局的非布局方向部分的值是否由子视图里面最大的值来决定,当是垂直布局时则布局的宽度由子视图中最宽的子视图的宽度决定,而当是水平布局时则布局的高度由子视图中最高的子视图的高度决定。这个属性默认的值是NO, wrapContent设置为YES则场景更多应用在布局里面的子视图是UILabel的时候,当label设置了文字的内容后调用sizeToFit后系统会自动计算出其宽度,从而出发重新布局。重新调整布局的高度和宽度。&&& -(void)loadView &&&& { &&&&&&&& [super loadView]; &&&&&&&&& &&&&&&&& //布局视图中不需要指定宽度,而是由最大子视图决定宽度 &&&&&&&& MyLinearLayout *ll = [[MyLinearLayout alloc] initWithFrame:CGRectMake(100, 100, 0,0)]; &&&&&&&& ll.orientation = LVORIENTATION_VERT; &&&&&&&& ll.wrapContent = YES; &&&&&&&& ll.backgroundColor = [UIColor grayColor]; &&&&&&&&& &&&&&&&& UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 90, 40)]; //这个子视图最宽 &&&&&&&& v1.backgroundColor = [UIColor redColor]; &&&&&&&& v1.marginGravity = MGRAVITY_HORZ_LEFT; //如果不设置这个属性则左右margin无效 &&&&&&&& v1.leftMargin = 10; &&&&&&&& v1.rightMargin = 20; //父视图宽度会是90+10+20 &&&&&&&& v1.topMargin = 4; &&&&&&&& [ll addSubview:v1]; &&&&&&&&& &&&&&&&& UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 60)]; &&&&&&&& v2.backgroundColor = [UIColor greenColor]; &&&&&&&& v2.topMargin = 6; &&&&&&&& [ll addSubview:v2]; &&&&&&&&& &&&&&&&&& &&&&&&&& UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 75, 30)]; &&&&&&&& v3.backgroundColor = [UIColor blueColor]; &&&&&&&& v3.topMargin = 3; &&&&&&&& v3.topMargin = 4; &&&&&&&& [ll addSubview:v3]; &&&&&&&&& &&&&&&&& [self.view addSubview:ll]; &&&&&&&&& &&&&& &&&& } &上面的视图中可以看到布局视图的宽度是第一个视图的宽度外加上leftMargin,rightMargin的总值六、终极武器3:视图之间的间距也可以是相对值。&&&& 上面的所有布局中,我们可以让布局视图随着子视图的尺寸进行大小的调整,也可以让子视图随着布局视图的尺寸进行大小的调整,也可以使用weight进行子视图的按比例尺寸分配,也可以使用gravity进行子视图的位置和尺寸的控制。但是前面的代码中所有的间距指定的都是固定值,正是因为间距部分是固定值,因此我们还是无法好好的适配不同尺寸的屏幕,比如有时候我们希望子视图的尺寸是固定的,但是视图之间的间距是随着屏幕尺寸的大小而调整。在比如下面的登录对话框&&&&& &&&&&& 我们要求底部版权部分固定在底部,并且有固定的底部边距,而中间的图标和账号输入框的间距之间则需要根据布局的大小的调整而进行缩放。这时候因为子视图的高度是固定的,而间距是浮动的,因此解决的方法就是我们不设置固定的间距,而是设置浮动的间距,将间距按一定比例进行指定。通过采用间距使用比例的方法我们可以很容易的实现则不同屏幕尺寸上以及横向和纵向屏幕上进行完美的适配,这样的话我们是不是不再需要size class了。 上面的子视图扩展属性中我们已经看到了四个边距值是可以设置相对边距的,当我们把边距设置为&0而小于1的话,则表明是按比例来设置间距。我们可以看看如下代码是如何实现上述功能的:&&& -(void)loadView &&&& { &&&&&&&&& &&&&&&&&& &&&&&&&& MyLinearLayout *ll = [MyLinearLayout new]; &&&&&&&& ll.backgroundColor = [UIColor grayColor]; &&&&&&&& ll.autoAdjustSize& = NO; &&&&&&&& ll.gravity = MGRAVITY_HORZ_CENTER; &&&&&&&&& &&&&&&&& //头像 &&&&&&&& UIImageView *imgView = [UIImageView new]; &&&&&&&& imgView.image = [UIImage imageNamed:@&user&]; &&&&&&&& imgView.backgroundColor = [UIColor whiteColor]; &&&&&&&& [imgView sizeToFit]; &&&&&&&&& &&&&&&&& imgView.topMargin = 0.45; &&&&&&&&& &&&&&&&& [ll addSubview:imgView]; &&&&&&&&& &&&&&&&&& &&&&&&&& //输入框 &&&&&&&& UITextField *txtField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 200, 40)]; &&&&&&&& txtField.borderStyle = UITextBorderStyleL &&&&&&&& txtField.placeholder = @&请输入用户名称&; &&&&&&&& txtField.backgroundColor = [UIColor whiteColor]; &&&&&&&&& &&&&&&&& txtField.topMargin = 0.1; &&&&&&&& txtField.bottomMargin = 0.45; &&&&&&&& [ll addSubview:txtField]; &&&&&&&&& &&&&&&&& UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]; &&&&&&&& lab.bottomMargin = 20; &&&&&&&& lab.text = @&版权所有 XXX 公司&; &&&&&&&& [lab sizeToFit]; &&&&&&&&& &&&&&&&& [ll addSubview:lab]; &&&&&&&&& &&&&&&&&& &&&&&&&& self.view = &&&&&&&&& &&&&&&&&& &&&& } &上面的代码中我们可以看到底部子视图的bottomMargin使用的是固定的间距也就是保证在底部,而头像和布局,头像和账号,以及账号和底部则采用的是相对的margin值,这样就是实现了上述的功能了,这样是不是很简单。通过相对间距和子视图的weight属性,我们还能实现很多强大的功能,比如:1.我们想让某个子视图跟父视图的边距始终保持在整体宽度的20%左右,那么我们只需要为子视图的leftMargin = 0.2就可以了,然后设置子视图的marginGravity& = MGRAVITY_HORZ_LEFT. 就可以了。2.我们在一个垂直布局中有3个子视图,并且要求这三个子视图的高度保持一致,同时间距也和高度保持一致,也就是平均分布三个子视图。代码如下:&&& -(void)loadView &&&& { &&&&&&&&& &&&&&&&& MyLinearLayout *ll = [MyLinearLayout new]; &&&&&&&& ll.backgroundColor = [UIColor grayColor]; &&&&&&&& ll.autoAdjustSize& = NO; &&&&&&&& ll.gravity = MGRAVITY_HORZ_CENTER; &&&&&&&& ll.leftPadding = 10; &&&&&&&& ll.rightPadding = 10; &&&&&&&&& &&&&&&&& UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 100)]; &&&&&&&& v1.backgroundColor = [UIColor redColor]; &&&&&&&& v1.matchParentWidth = 1; &&&&&&&&& &&&&&&&&& &&&&&&&& [ll addSubview:v1]; &&&&&&&& &&&&&&&&& &&&&&&&& UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 50)]; &&&&&&&& v2.backgroundColor = [UIColor greenColor]; &&&&&&&& v2.matchParentWidth = 1; &&&&&&&& &&&&&&&& [ll addSubview:v2]; &&&&& &&&&&&&&& &&&&&&&&& &&&&&&&& UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 70)]; &&&&&&&& v3.backgroundColor = [UIColor blueColor]; &&&&&&&& v3.matchParentWidth = 1; &&&&&&&& [ll addSubview:v3]; &&&&& &&&&&&&& &&&&&&&& //每个视图的高度保持原始值,剩余的部分平分间距 &&&&&&&& //[ll averageMargin:YES]; &&&&&&&& //会把视图和间距都平分,即使设置了高度也无效。 &&&&&&&& [ll averageSubviews:YES]; &&&&&&&&& &&&&&&&& self.view = &&&&&&&&& &&&&&&&&& &&&& } &三个子视图和间距的高度都是平均的。看如下函数:-(void)averageSubviews:(BOOL)这个函数用来指定将子视图和间距平均分配,centered表示是否整体居中,也就是是否保留顶部和底部的边距。-(void)averageMargin:(BOOL)这个函数要求每个子视图都具有固定的高度或者宽度,而是把所有剩余的间距全部平分,同样centered也表示视图是否居中。需要注意的是上面两个函数只对之前添加的视图有效,后续添加的视图是无效的。七、终极武器4:UITableView的替代品。&&& 实践中我们经常使用UITableView来布局一些静态的CELL,这种方式在某些场合确实很方面,既可以重用又可以很方便的使用滚动视图的功能,但是静态CELL一个最致命的问题是,有时候我们的某个CELL的高度是要求动态变化的,而且有时候我们的CELL里面有UILabel,里面的内容假如很长的话需要换行显示,从而调整CELL的高度,于是我们就只能在:- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexP动态计算CELL的高度,然后又在CELL中进行各种麻烦的布局,而且这个问题AutoLayout是无法解决的。我象形很多人都会在这个问题上写很多代码。还有一个场景是我们的CELL之间是可以设置分割线的,但是有时候有些需求是我们要求顶部没有线,底部没有线等等一些奇怪的问题,于是乎我们就需要在CELL中插入背景视图并且把CELL的分割线属性取消来解决这个问题,还有一个场景是因为CELL是可以复用的,一旦CELL不可见系统自动删除子视图的内容(注意这时候子视图上的一些状态是无法保留的),然后出现时你又要重新根据状态来设置CELL中的内容,这样你就需要单独的保存各种视图的状态数据。&&&&& 其实对于一些静态CELL的情况下因为CELL的数量不多,我们完全不需要考虑内存以及复用的问题。我们只要在UIScrollView上直接线性布局就可以了。这时候我们就可以祭出MyLayout的两个大杀器了:边界线绘制以及布局的触摸处理事件,通过这两个属性就可以完全把一个MyLinearLayout当做一个CELL来使用了。边界线绘制为我们实现四个边界的线条的绘制,他支持线条的颜色,粗细,缩进,立体,点线的绘制://指定四个边界线的绘制。@property(nonatomic,strong)MyBorderLineDraw *leftBorderL@property(nonatomic,strong)MyBorderLineDraw *rightBorderL@property(nonatomic,strong)MyBorderLineDraw *topBorderL@property(nonatomic,strong)MyBorderLineDraw *bottomBorderL//同时设置4个边界线。@property(nonatomic,strong)MyBorderLineDraw *boundBorderL然后MyBorderLineDraw的定义如下:@interface MyBorderLineDraw :NSObject@property(nonatomic)UIColor *&&&&&&&&&&& //颜色@property(nonatomic)UIColor *insetC&&&&&& //嵌入颜色,用于实现立体效果@property(nonatomic,assign)CGF&&&&& //厚度,默认为1@property(nonatomic,assign)CGFloat headI //头部缩进@property(nonatomic,assign)CGFloat tailI //尾部缩进@property(nonatomic,assign)CGF&&&&&& //虚线的点数如果为0则是实线。-(id)initWithColor:(UIColor*)@end通过边界线我们可以实现布局视图四个方向的边界线的绘制。布局视图的另外两个属性如下://高亮的背景色,我们支持在布局中执行单击的事件,用户按下时背景会高亮.只有设置了事件才会高亮@property(nonatomic,strong)UIColor *highlightedBackgroundC//设置单击触摸的事件,如果target为nil则取消事件。-(void)setTarget:(id)target action:(SEL)没错!我们可以为布局视图设置单击处理事件!以及单击时的高亮显示颜色。这两个功能是代替- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexP的强有力武器,只要我们把一个垂直MyLinearLayout作为UIScrollView的子视图,并且垂直的MyLinearLayout中加入多个水平的MyLinearLayout子视图(起到CELL的功能),然后为每个水平的子布局视图添加时间处理函数就好了。 废话这么多,上界面吧。八、总结MyLinearLayout的功能基本就介绍完成了,最后需要总结的是: MyLinearLayout可以完全胜任屏幕的旋转,各种尺寸的完美适配。各种版本操作系统的完美适配,开发简单易用而且功能强大,而且他不是基于AutoLayout的也不是基于Size Class,没有版本限制,也不需要学习新的布局知识。MyRelativeLayout子视图在IOS中我们要想进行视图的各方向的停靠,需要用到autoresizingMask,以及不停的计算应该停靠的位置,也就是计算frame中的x,y,width,height,这样大量的编码导致计算繁琐而且容易出错,因此我这里推出了另外新的布局模式MyFrameLayout。这个布局可以让子视图实现左中右,上中下,填充等功能的布局,同时还可以设置停靠的布局的位置的边距,我们对子视图扩展出了停靠位置的属性:@property(nonatomic,assign)MarignGravity marginG这个属性用来控制子视图停靠在MyFrameLayout的方位,这些方位可以是如下方位的或组合:&&& MGRAVITY_NONE& //不采用停靠模式&&& MGRAVITY_HORZ_LEFT& //水平居左&&& MGRAVITY_HORZ_CENTER& //水平居中&&& MGRAVITY_HORZ_RIGHT& //水平居右&&& MGRAVITY_HORZ_FILL& //水平填充整个布局,视图会有拉伸&&& MGRAVITY_VERT_TOP& //垂直居上&&& MGRAVITY_VERT_CENTER //垂直居中&&& MGRAVITY_VERT_BOTTOM& //垂直居下&&&& MGRAVITY_VERT_FILL& //垂直填充整个布局,视图会有拉伸&&& MGRAVITY_CENTER& //整个视图居中&&& MGRAVITY_FILL& //整个视图填满布局视图除了可以让子视图停靠在布局的方位外,还可以指定子视图离停靠位置的边距,这个可以通过扩展的视图的四个属性:@property(nonatomic,assign)CGFloat topM@property(nonatomic,assign)CGFloat leftM@property(nonatomic,assign)CGFloat bottomM@property(nonatomic,assign)CGFloat rightM这四个属性用来设置视图离停靠位置的四个距离。同时MyFrameLayout中还提供一个padding的属性用来控制整体的子视图离自己的边距。因为这个布局的使用比较简单,下面直接可以看图:对应的代码如下:&&& MyFrameLayout *fl = [[MyFrameLayout alloc] initWithFrame:self.view.bounds]; &&&&&& fl.autoresizingMask =& UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleH &&&&&& fl.padding = UIEdgeInsetsMake(20, 20, 20, 20); &&&&&& fl.backgroundColor = [UIColor grayColor]; &&&&&&& &&&&&& //显示全屏 &&&&&& UILabel *fill = UILabel. &&&&&& fill.text = @&&&&&&&&&&&&&&&& fill&; &&&&& // fill.textAlignment = NSTextAlignmentC &&&&&& fill.backgroundColor = [UIColor blueColor]; &&&&&& fill.marginGravity = MGRAVITY_FILL; &&&&&& [fl addSubview:fill]; &&&&&&& &&&&&&& &&&&&&& &&&&&& //左右填充。 &&&&&& UILabel *horzFill = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 120)]; &&&&&& horzFill.text = @&Horz Fill&; &&&&&& horzFill.textAlignment = NSTextAlignmentC &&&&&& horzFill.backgroundColor = [UIColor greenColor]; &&&&&& horzFill.marginGravity = MGRAVITY_HORZ_FILL; &&&&&& [fl addSubview:horzFill]; &&&&&&& &&&&&&& &&&&&& //左右居中 &&&&&& UILabel *horzCenter = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 50)]; &&&&&& horzCenter.text = @&Horz Center&; &&&&&& horzCenter.backgroundColor = [UIColor whiteColor]; &&&&&& horzCenter.marginGravity = MGRAVITY_HORZ_CENTER; &&&&&& [fl addSubview:horzCenter]; &&&&& &&&&&&& &&&&&& //左上 &&&&&& UILabel *topLeft = UILabel. &&&&&& topLeft.text = @&topLeft&; &&&&&& [topLeft sizeToFit]; &&&&&& topLeft.backgroundColor = [UIColor whiteColor]; &&&&&& topLeft.marginGravity = MGRAVITY_HORZ_LEFT | MGRAVITY_VERT_TOP; &&&&&& [fl addSubview:topLeft]; &&&&&&& &&&&&& //左中 &&&&&& UILabel *centerLeft = UILabel. &&&&&& centerLeft.text = @&centerLeft&; &&&&&& [centerLeft sizeToFit]; &&&&&& centerLeft.backgroundColor = [UIColor whiteColor]; &&&&&& centerLeft.marginGravity = MGRAVITY_HORZ_LEFT | MGRAVITY_VERT_CENTER; &&&&&& [fl addSubview:centerLeft]; &&&&&&& &&&&&&& &&&&&& //左下 &&&&&& UILabel *bottomLeft = UILabel. &&&&&& bottomLeft.text = @&bottomLeft&; &&&&&& [bottomLeft sizeToFit]; &&&&&& bottomLeft.backgroundColor = [UIColor whiteColor]; &&&&&& bottomLeft.marginGravity = MGRAVITY_HORZ_LEFT | MGRAVITY_VERT_BOTTOM; &&&&&& [fl addSubview:bottomLeft]; &&&&&&& &&&&&&& &&&&&& //中上 &&&&&& UILabel *topCenter = UILabel. &&&&&& topCenter.text = @&topCenter&; &&&&&& [topCenter sizeToFit]; &&&&&& topCenter.backgroundColor = [UIColor greenColor]; &&&&&& topCenter.marginGravity = MGRAVITY_HORZ_CENTER | MGRAVITY_VERT_TOP; &&&&&& [fl addSubview:topCenter]; &&&&&&& &&&&&&& &&&&&& //中中。 &&&&&& UILabel *centerCenter = UILabel. &&&&&& centerCenter.text = @&centerCenter&; &&&&&& [centerCenter sizeToFit]; &&&&&& centerCenter.backgroundColor = [UIColor greenColor]; &&&&&& centerCenter.marginGravity = MGRAVITY_HORZ_CENTER | MGRAVITY_VERT_CENTER; &&&&&& [fl addSubview:centerCenter]; &&&&&&& &&&&&&& &&&&&& //中下 &&&&&& UILabel *bottomCenter = UILabel. &&&&&& bottomCenter.text = @&bottomCenter&; &&&&&& [bottomCenter sizeToFit]; &&&&&& bottomCenter.backgroundColor = [UIColor greenColor]; &&&&&& bottomCenter.marginGravity = MGRAVITY_HORZ_CENTER | MGRAVITY_VERT_BOTTOM; &&&&&& [fl addSubview:bottomCenter]; &&&&& &&&&&&& &&&&&& //右上 &&&&&& UILabel *topRight = UILabel. &&&&&& topRight.text = @&topRight&; &&&&&& [topRight sizeToFit]; &&&&&& topRight.backgroundColor = [UIColor greenColor]; &&&&&& topRight.marginGravity = MGRAVITY_HORZ_RIGHT | MGRAVITY_VERT_TOP; &&&&&& [fl addSubview:topRight]; &&&&&&& &&&&&&& &&&&&& //右中 &&&&&& UILabel *centerRight = UILabel. &&&&&& centerRight.text = @&centerRight&; &&&&&& [centerRight sizeToFit]; &&&&&& centerRight.backgroundColor = [UIColor greenColor]; &&&&&& centerRight.marginGravity = MGRAVITY_HORZ_RIGHT | MGRAVITY_VERT_CENTER; &&&&&& [fl addSubview:centerRight]; &&&&& &&&&&&& &&&&&& UILabel *bottomRight = UILabel. &&&&&& bottomRight.text = @&bottomRight&; &&&&&& [bottomRight sizeToFit]; &&&&&& bottomRight.backgroundColor = [UIColor greenColor]; &&&&&& bottomRight.marginGravity = MGRAVITY_HORZ_RIGHT | MGRAVITY_VERT_BOTTOM; &&&&&& [fl addSubview:bottomRight]; &&&&&&& &&&&& &&&&&& //居中显示。 &&&&&& UILabel *center = UILabel. &&&&&& center.text = @&center&; &&&&&& [center sizeToFit]; &&&&&& center.backgroundColor = [UIColor redColor]; &&&&&& center.marginGravity = MGRAVITY_CENTER; &&&&&& center.leftMargin = 30; &&&&&& center.rightMargin = 30; &&&&&& center.topMargin = 30; &&&&&& center.bottomMargin = 30; &&&&&& [fl addSubview:center]; &&&&& &&&&&&& &&&&&& [self.view addSubview:fl]; &&从代码中我们可以看到每个视图只需要设置marginGravity的对应的停靠的位置,以及设置对应的xxxMargin边距,还有设置MyFrameLayout的padding值来设置里面里面的子视图离自己的边距。总结:&& 对于那些希望固定在某个位置的子视图来说,我们可以通过将视图加入到MyFrameLayout中来实现。MyRelativeLayout相对视图所谓相对布局就是指某个视图的位置和尺寸不是固定写死的而是依赖于其他关联的视图,比如一个视图在另外一个视图的左边,或者在另外一个视图的右下方,或者一个视图的宽度和另外一个视图宽度是相等的,或者视图是在父视图的顶部偏移一定的量,或者某一组视图的宽度要平分父视图等等功能。因此我们分别为子视图定义了如下的扩展属性:@interface UIView(MyRelativeLayoutEx)//位置@property(nonatomic,readonly)& MyRelativePos *leftP@property(nonatomic,readonly)& MyRelativePos *topP@property(nonatomic,readonly)& MyRelativePos *rightP@property(nonatomic,readonly)& MyRelativePos *bottomP@property(nonatomic,readonly)& MyRelativePos *centerXP@property(nonatomic,readonly)& MyRelativePos *centerYP//尺寸@property(nonatomic,readonly)& MyRelativeDime *widthD@property(nonatomic,readonly)& MyRelativeDime *heightD@end分别来定义视图的左,上,右,下,水平中心,垂直中心,宽度,高度8个方位和尺寸的相对依赖对象,其中MyRelativePos用来定义相对的依赖位置类。它的定义如下:@interface MyRelativePos :NSObject//偏移-(MyRelativePos* (^)(CGFloat val))//NSNumber, MyRelativePos对象-(MyRelativePos* (^)(id val))equalTo;@end这个类中的offset用来指定某个位置的偏移值,而equalTo则用来指定依赖的某个位置和值,比如:1.A视图的左边等于B视图的右边并偏移30个点: A.leftPos.equalTo(B.rightPos).offset(30)2.A视图的顶部和父视图的顶部相等:A.topPos.equalTo(A.superView.topPos)3.A视图的中间在父视图的中间:&& A.centerXPos.equalTo(A.superView.centerXPos); A.centerYPos.equalTo(A.superView.centerYPos)4.A视图的左边偏移20: A.offset(20)而对于相对尺寸则定义了MyRelativeDime类来定义宽度和高度,这个类的定义如下:@interface MyRelativeDime :NSObject//乘-(MyRelativeDime* (^)(CGFloat val))//加,用这个和equalTo的数组功能可以实现均分子视图宽度以及间隔的设定。-(MyRelativeDime* (^)(CGFloat val))//NSNumber, MyRelativeDime以及MyRelativeDime数组,数组的概念就是所有数组里面的子视图的尺寸平分父视图的尺寸。-(MyRelativeDime* (^)(id val))equalTo;@end尺寸定义中equalTo用来指定尺寸的值,可以是NSNumber型指定绝对的尺寸,MyRelativeDime型指定相对的尺寸,NSArray[MyRelativeDime]来指定按比例分配父视图的尺寸,mutiply用来指定在equalTo上指定的值的倍数比例,add指定在equalTo上指定的值的增量值(add方法更多是用来指定间距)。1.A视图的宽度等于B视图的宽度,A视图的高度等于B视图的高度的一半:& A.widthDime.equalTo(B.widthDime); A.heightDime.equalTo(B.heightDime).multiply(0.5)2.A视图的高度等于B视图的高度,并增加20:&& A.heightDime.equalTo(B.heightDime).add(20)3.A,B,C三个视图平分父视图的宽度:& A.widthDime.equalTo(@[B.widthDime, C.widthDime])4.A视图固定宽度为20, B,C视图按4:6平分剩余的宽度:&& A.widthDime.equal(@20)& B.widthDime.equalTo(@[A.widthDime, C.widthDime.multiply(0.6)]).multiply(0.4)好了介绍了上述扩展的子视图的扩展属性后,我们需要的只是建立一个MyRelativeLayout布局视图,然后设置好子视图之间的相对依赖,然后添加进去就OK了。一、相对布局的子视图的依赖。上述的布局就是用相对布局实现,代码很简单,请参考如下:&&& -(void)loadView &&&& { &&&&&&&&& &&&&&&&& MyRelativeLayout *rl = [MyRelativeLayout new]; &&&&&&&& rl.padding = UIEdgeInsetsMake(10, 10, 10, 10); &&&&&&&& rl.backgroundColor = [UIColor grayColor]; &&&&&&&& self.view = &&&&&&&&& &&&&&&&& UILabel *lb1 = [UILabel new]; &&&&&&&& [rl addSubview:lb1]; &&&&&&&& lb1.text = @&你好&; &&&&&&&& [lb1 sizeToFit]; &&&&&&&& lb1.backgroundColor = [UIColor blueColor]; &&&&&&&& &&&&&&&&& &&&&&&&& lb1.leftPos.equalTo(rl.leftPos); //和父视图左边一致 &&&&&&&& lb1.topPos.equalTo(rl.topPos).offset(10); //和父视图顶部一致并偏移10 &&&&&&&& lb1.widthDime.equalTo(@60); //固定宽度 &&&&&&&&& &&&&&&&& UILabel *lb2 = [UILabel new]; &&&&&&&& [rl addSubview:lb2]; &&&&&&&& lb2.text = @&我好 hello&; &&&&&&&& lb2.backgroundColor = [UIColor redColor]; &&&&&&&&& &&&&&&&& lb2.leftPos.equalTo(lb1.rightPos); &&&&&&&& lb2.topPos.equalTo(lb1.bottomPos); &&&&&&&& lb2.widthDime.equalTo(lb1.widthDime).add(30); //宽度是lb1的宽度加30 &&&&&&&& lb2.heightDime.equalTo(lb1.heightDime).multiply(2).add(-10); //高度是lb1高度的2倍再-10 &&&&&&&&& &&&&&&&& UILabel *lb3 = [UILabel new]; &&&&&&&& lb3.text = @&中间&; &&&&&&&& lb3.backgroundColor = [UIColor greenColor]; &&&&&&&& [rl addSubview:lb3]; &&&&&&&&& &&&&&&&& lb3.centerXPos.equalTo(rl.centerXPos); &&&&&&&& lb3.centerYPos.equalTo(rl.centerYPos); &&&&&&&& lb3.widthDime.equalTo(rl.widthDime).multiply(0.2); &&&&&&&& lb3.heightDime.equalTo(rl.heightDime).multiply(0.1); &&&&&&&&& &&&&&&&& UILabel *lb4 = [UILabel new]; &&&&&&&& lb4.text = @&他好&; &&&&&&&& lb4.backgroundColor = [UIColor orangeColor]; &&&&&&&& [rl addSubview:lb4]; &&&&&&&&& &&&&&&&& //宽度和高度由左右决定 &&&&&&&& lb4.leftPos.equalTo(rl.leftPos); &&&&&&&& lb4.rightPos.equalTo(rl.rightPos); &&&&&&&& lb4.topPos.equalTo(@100); &&&&&&&& lb4.bottomPos.equalTo(@120); &&&&&&&& &&&& } &这段代码中请注意lb4的设置,我们会发现当我们同时指定了左右和上下的依赖视图时,宽度和高度就不需要指定出来,布局会自动算出高度和宽度。注意代码中我们还为相对布局指定了padding的值,表示里面的所有子视图都会在padding之内。二、相对布局的子视图的平均分配&有时候我们的布局的有些子视图希望能按父视图的尺寸来进行按某些规则进行分配,比如下面的布局:上面的视图中,第一排的3个子视图平分父视图的宽度。第二排子视图中第一个视图宽度固定,剩余的两个平分。第三排的子视图按0.2 0.3 0.5的比例来平分父视图,代码如下:&&& -(void)loadView &&&& { &&&&&&&& MyRelativeLayout *rl = [MyRelativeLayout new]; &&&&&&&& rl.padding = UIEdgeInsetsMake(0, 0, 0, 10); &&&&&&&& rl.backgroundColor = [UIColor grayColor]; &&&&&&&& self.view = &&&&&&&&& &&&&&&&& /**水平平分3个子视图**/ &&&&&&&& UIView *v1 = [UIView new]; &&&&&&&& v1.backgroundColor = [UIColor redColor]; &&&&&&&& v1.heightDime.equalTo(@40); &&&&&&&& [rl addSubview:v1]; &&&&&&&&& &&&&&&&& UIView *v2 = [UIView new]; &&&&&&&& v2.backgroundColor = [UIColor redColor]; &&&&&&&& v2.heightDime.equalTo(@40); &&&&&&&& [rl addSubview:v2]; &&&&& &&&&&&&& UIView *v3 = [UIView new]; &&&&&&&& v3.backgroundColor = [UIColor redColor]; &&&&&&&& v3.heightDime.equalTo(@40); &&&&&&&& [rl addSubview:v3]; &&&&& &&&&&&&& //v1,v2,v3平分父视图的宽度。在平分前减去了30用作间距 &&&&&&&& v1.widthDime.equalTo(@[v2.widthDime.add(-10), v3.widthDime.add(-10)]).add(-10); &&&&&&&& v1.leftPos.offset(10); &&&&&&&& v2.leftPos.equalTo(v1.rightPos).offset(10); &&&&&&&& v3.leftPos.equalTo(v2.rightPos).offset(10); &&&&&&&&& &&&&& &&&&&&&& /**某个视图固定其他平分**/ &&&&&&&& UIView *v4 = [UIView new]; &&&&&&&& v4.backgroundColor = [UIColor greenColor]; &&&&&&&& v4.topPos.equalTo(v1.bottomPos).offset(80); &&&&&&&& v4.heightDime.equalTo(@40); &&&&&&&& v4.widthDime.equalTo(@260); //第一个视图宽度固定 &&&&&&&& [rl addSubview:v4]; &&&&&&&&& &&&&&&&& UIView *v5 = [UIView new]; &&&&&&&& v5.backgroundColor = [UIColor greenColor]; &&&&&&&& v5.topPos.equalTo(v4.topPos); &&&&&&&& v5.heightDime.equalTo(@40); &&&&&&&& [rl addSubview:v5]; &&&&&&&&& &&&&&&&& UIView *v6 = [UIView new]; &&&&&&&& v6.backgroundColor = [UIColor greenColor]; &&&&&&&& v6.topPos.equalTo(v4.topPos); &&&&&&&& v6.heightDime.equalTo(@40); &&&&&&&& [rl addSubview:v6]; &&&&&&&&& &&&&&&&& //v1,v2,v3平分父视图的宽度。在平分前减去了30用作间距 &&&&&&&& v5.widthDime.equalTo(@[v4.widthDime.add(-10), v6.widthDime.add(-10)]).add(-10); &&&&&&&& v4.leftPos.offset(10); &&&&&&&& v5.leftPos.equalTo(v4.rightPos).offset(10); &&&&&&&& v6.leftPos.equalTo(v5.rightPos).offset(10); &&&&&&&&& &&&&&& &&&&&&&&& &&&&&&&& /**子视图按比例平分**/ &&&&&&&& UIView *v7 = [UIView new]; &&&&&&&& v7.backgroundColor = [UIColor blueColor]; &&&&&&&& v7.topPos.equalTo(v4.bottomPos).offset(80); &&&&&&&& v7.heightDime.equalTo(@40); &&&&&&&& [rl addSubview:v7]; &&&&&&&&& &&&&&&&& UIView *v8 = [UIView new]; &&&&&&&& v8.backgroundColor = [UIColor blueColor]; &&&&&&&& v8.topPos.equalTo(v7.topPos); &&&&&&&& v8.heightDime.equalTo(@40); &&&&&&&& [rl addSubview:v8]; &&&&&&&&& &&&&&&&& UIView *v9 = [UIView new]; &&&&&&&& v9.backgroundColor = [UIColor blueColor]; &&&&&&&& v9.topPos.equalTo(v7.topPos); &&&&&&&& v9.heightDime.equalTo(@40); &&&&&&&& [rl addSubview:v9]; &&&&&&&&& &&&&&&&& v7.widthDime.equalTo(@[v8.widthDime.multiply(0.3).add(-10),v9.widthDime.multiply(0.5).add(-10)]).multiply(0.2).add(-10); &&&&&&&& v7.leftPos.offset(10); &&&&&&&& v8.leftPos.equalTo(v7.rightPos).offset(10); &&&&&&&& v9.leftPos.equalTo(v8.rightPos).offset(10); &&&&&&&&& &&&&&&&& //请分别设置每个视图.hidden = YES 并且设置布局的@property(nonatomic, assign) BOOL flexOtherViewWidthWhenSubviewHidden为YES和NO的效果 &&&&& &&&& } &看代码我们发现,在分配视图时指定了视图之间的间距这需要借助offset的调用来指定间距,因为是均分视图我们又需要为视图的宽度留有间隔,因此我们需要借助add的方法来将计算出的宽度减去间距的值,而同时我们为布局视图的padding的值,我们设置了10的间距来控制最右边的间距为10。& 有的时候我们在均分子视图时,当某个子视图隐藏时其他的剩余的子视图的宽度会进行调整,比如某个子视图设置为隐藏后,右边的子视图向左边靠拢。而有的时候我们希望当某个子视图隐藏时,剩余的部分重新填充慢布局视图的某个方位的尺寸,因此我们可以为布局视图设置开关://均分宽度时当有隐藏子视图,是否参与宽度计算,这个属性只有在参与均分视图的子视图隐藏时才有效,默认是NO@property(nonatomic,assign) BOOL flexOtherViewWidthWhenSubviewH//均分高度时当有隐藏子视图,是否参与高度计算,这个属性只有在参与均分视图的子视图隐藏时才有效,默认是NO@property(nonatomic,assign) BOOL flexOtherViewHeightWhenSubviewH这两个布局视图的属性分别标明当某个子视图数组均分父视图时,而其中某个子视图隐藏时,是否其他视图会重新分配宽度和高度。三、相对布局的高宽由子视图决定我在线性布局的文章中有说明可以通过wrapContent来决定是否布局视图的非方向是否由子视图来决定。这时候我们就不需要手动的指定布局视图的高度和宽度,而是由布局视图里面的子视图来决定布局的尺寸,在android系统中我们可以设置matchParent, wrapContent来设置布局视图的尺寸。同样我们在布局中也分别提供了四个属性:@property(nonatomic,assign)CGFloat matchParentW@property(nonatomic,assign)CGFloat matchParentH@property(nonatomic,assign) BOOL wrapContentW@property(nonatomic,assign) BOOL wrapContentH从上面的定义可以看出,matchParentWidth, matchParentHeight是用来指定布局视图的高度和宽度和其父视图的高度一致,或者是父视图的某个比例值,而wrapContentWidth, wrapContentHeight则是指定布局视图的宽度和高度由子视图决定。 需要注意的是matchParentWidth, wrapContentWidth是不能同时指定的,因为这会造成约束冲突。我们这里只介绍wrapContent,如果想了解matchParentWidth请参考我的关于MyLinearLayout方面的文章。我们先看结果界面:&&&& -(void)loadView &&&& { &&&&&&&& [super loadView]; &&&&&&&&& &&&&&&&& MyRelativeLayout *rl = [[MyRelativeLayout alloc] initWithFrame:CGRectMake(10, 10, 0, 0)]; &&&&&&&& [self.view addSubview:rl]; &&&&&&&& rl.wrapContentWidth = YES; &&&&&&&& rl.wrapContentHeight = YES; //设置宽度和高度由所有子视图包裹 &&&&&&&& rl.backgroundColor = [UIColor grayColor]; &&&&&&&&& &&&&&&&& UILabel *lb1 = [UILabel new]; &&&&&&&& lb1.leftPos.equalTo(rl.leftPos).offset(20); &&&&&&&& lb1.text = @&aaaa&; &&&&&&&& lb1.backgroundColor = [UIColor redColor]; &&&&&&&& [lb1 sizeToFit]; &&&&&&&& lb1.rightPos.offset(20); &&&&&&&&& &&&&&&&& [rl addSubview:lb1]; &&&&&&&&& &&&&&&&&& &&&&&&&& UILabel *lb3 = [UILabel new]; &&&&&&&& lb3.rightPos.equalTo(rl.rightPos).offset(5); //虽然这时候父视图的宽度为0,但还是可以设置离父视图的距离 &&&&&&&& lb3.topPos.equalTo(rl.topPos).offset(30); &&&&&&&& lb3.bottomPos.offset(10); &&&&&&&& lb3.text = @&ccc&; &&&&&&&& lb3.backgroundColor = [UIColor redColor]; &&&&&&&& [lb3 sizeToFit]; &&&&&&&&& &&&&&&&& [rl addSubview:lb3]; &&&&&&&&& &&&&&&&&& &&&&&&&& UILabel *lb2 = [UILabel new]; &&&&&&&& lb2.text = @&bbbb&; &&&&&&&& lb2.backgroundColor = [UIColor blueColor]; &&&&&&&&& &&&&&&&& lb2.leftPos.equalTo(lb1.centerXPos); &&&&&&&& lb2.topPos.equ

我要回帖

更多关于 网贷资金存管业务规范 的文章

 

随机推荐