为什么那里要steam喜加一在那里抽个1/r^2啊??

在html文件中使用print_r会多出一个1 - ThinkPHP框架
print_r输出最后多出一个1,如果是php输出的不会多出一个1.
注释去掉后,输出后面不会多出1
yiranrucianjing
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。阅读下面的资料:在经典力学中,动量(国际单位制中的单位为kg?m/s)表示为物体的质量和速度的乘积.和动量是状态量不同,冲量是一个过程量.&一个恒力的冲量指的是这个力与其作用时间的乘积.冲量表述了对质点作用一段时间的积累效应的物理量,是改变质点机械运动状态的原因.&冲量的量纲和单位都与动量一样.(kg&m/s&或&N?s=Huygens&Hy).动量定理:物体所受合外力的冲量等于它的动量的变化量.球的表面积公式S=4πR2球的体积公式V=$\frac{4}{3}$πR3其中R表示球的半径.光子具有能量,也具有动量.光照射到物体表面时,会对物体产生压强,这就是“光压”.光压的产生机理如同气体压强:大量气体分子与器壁的频繁碰撞产生了持续均匀的压力,器壁在单位面积上受到的压力就是气体的压强.设太阳光每个光子的平均能量为E,太阳光垂直照射地球表面时,在单位面积上的辐射功率为P0.已知光速为c,则光子的动量为E/c.求:(1)若太阳光垂直照射在地球表面,试计算时间t内照射到地球表面上半径为r的圆形区域内光子的总动量.(2)一般情况下,太阳光照射到物体表面时,一部分会被反射,还有一部分被吸收.当物体表面的反射系数为ρ时,则在每秒内照射到物体表面的全部n个光子中,有(1-ρ)n个被吸收而ρn个被反射.若太阳光垂直照射在地球表面反射系数为ρ、半径为r的某圆形区域内,则在时间t内照射到此区域的光子的总动量的变化量是多少?(3)在第(2)问中太阳光在圆形区域表面产生的光压(用I表示光压)是多少?
(1)先求出照射到圆形区域的光的总能量,总能量除以每一个光子的能量可求出光子数,光子数乘以每一个光子的动量,就是照到圆形区域光子的总动量.(2)先求出光子被反射或吸收时光子动量的变化量,动量的该变量乘以光子数,就是光子总动量的变化量.(3)由动量定理求出光子对地球表面的压力,然后由压强公式求出光压.
(1)在时间t内太阳光照射到面积为S的圆形区域上的总能量E总=P0St,照射到此圆形区域的光子数n=$\frac{{E}_{总}}{E}$.每个光子的动量是p=$\frac{E}{c}$,则到达地球表面半径为r的圆形区域的光子总动量P总=nP=$\frac{π{r}^{2}{P}_{0}t\;}{c}$.(2)光子被完全反射时,每个光子动量的改变量△P0=2P,光子被吸收时每个光子动量的改变量是△P‘0=P,则时间t内光子总动量的该变量△P=ρn×2P+(1-ρ)×nP,则△P=(1+ρ)$\frac{{π{r^2}{P_0}t}}{c}$.(3)设太阳光对此圆形区域表面的压力为F,根据动量定理得:Ft=△P,太阳光在圆形区域产生的光压I=$\frac{F}{S}$=(1+ρ)$\frac{P_0}{c}$.答:(1)时间t内照射到地球表面上半径为r的圆形区域内光子的总动量是p总=$\frac{{π{r^2}{P_0}t}}{c}$.(2)时间t内照射到此区域的光子的总动量的变化量是△p=(1+ρ)$\frac{{π{r^2}{P_0}t}}{c}$…(3)太阳光在圆形区域表面产生的光压是I=(1+ρ)$\frac{P_0}{c}$.1、什么时候使用多路由协议?当两种不同的路由协议要交换路由信息时,就要用到多路由协议。当然,路由再分配也可以交换路由信息。下列情况不必使用多路由协议:
a.从老版本的内部网关协议( Interior Gateway Protocol,I G P)升级到新版本的I G P。b.你想使用另一种路由协议但又必须保留原来的协议。c.你想终止内部路由,以免受到其他没有严格过滤监管功能的路由器的干扰。d.你在一个由多个厂家的路由器构成的环境下。
2、什么是距离向量路由协议?距离向量路由协议是为小型网络环境设计的。在大型网络环境下,这类协议在学习路由及保持路由将产生较大的流量,占用过多的带宽。如果
在9 0秒内没有收到相邻站点发送的路由选择表更新,它才认为相邻站点不可达。每隔30秒,距离向量路由协议就要向相邻站点发送整个路由选
择表,使相邻站点的路由选择表得到更新。这样,它就能从别的站点(直接相连的或其他方式连接的)收集一个网络的列表,以便进行路由选择
。距离向量路由协议使用跳数作为度量值,来计算到达目的地要经过的路由器数。例如,R I P使用B e l l m a n - F o r d算法确定最短路
径,即只要经过最小的跳数就可到达目的地的线路。最大允许的跳数通常定为1 5。那些必须经过1 5个以上的路由器的终端被认为是不可到达
距离向量路由协议有如下几种: IP RIP、IPX RIP、A p p l e Talk RT M P和I G R P。
3、什么是链接状态路由协议?链接状态路由协议更适合大型网络,但由于它的复杂性,使得路由器需要更多的C P U资源。它能够在更短的时间内发现已经断了的链路或新连
接的路由器,使得协议的会聚时间比距离向量路由协议更短。通常,在1 0秒钟之内没有收到邻站的H E L LO报文,它就认为邻站已不可达。一
个链接状态路由器向它的邻站发送更新报文,通知它所知道的所有链路。它确定最优路径的度量值是一个数值代价,这个代价的值一般由链路
的带宽决定。具有最小代价的链路被认为是最优的。在最短路径优先算法中,最大可能代价的值几乎可以是无限的。如果网络没有发生任何变
化,路由器只要周期性地将没有更新的路由选择表进行刷新就可以了(周期的长短可以从3 0分钟到2个小时)。
链接状态路由协议有如下几种: IP OSPF、IPX NLSP和I S - I S。
4、一个路由器可以既使用距离向量路由协议,又使用链接状态路由协议吗?可以。每一个接口都可以配置为使用不同的路由协议;但是它们必须能够通过再分配路由来交换路由信息。
5、什么是访问表?访问表是管理者加入的一系列控制数据包在路由器中输入、输出的规则。它不是由路由器自己产生的。访问表能够允许或禁止数据包进入或输
出到目的地。访问表的表项是顺序执行的,即数据包到来时,首先看它是否是受第一条表项约束的,若不是,再顺序向下执行;如果它与第一条
表项匹配,无论是被允许还是被禁止,都不必再执行下面表项的检查了。每一个接口的每一种协议只能有一个访问表。&-争做一流系统集成服务提供商-深圳市安易科技有限公司
设为首页&&&&&&
加入收藏&&&&&
当前位置: &&
网络工程师必懂的专业术语
1、什么时候使用多路由协议?当两种不同的路由协议要交换路由信息时,就要用到多路由协议。当然,路由再分配也可以交换路由信息。下列情况不必使用多路由协议:
a.从老版本的内部网关协议( Interior Gateway Protocol,I G P)升级到新版本的I G P。b.你想使用另一种路由协议但又必须保留原来的协议。c.你想终止内部路由,以免受到其他没有严格过滤监管功能的路由器的干扰。d.你在一个由多个厂家的路由器构成的环境下。
2、什么是距离向量路由协议?距离向量路由协议是为小型网络环境设计的。在大型网络环境下,这类协议在学习路由及保持路由将产生较大的流量,占用过多的带宽。如果
在9 0秒内没有收到相邻站点发送的路由选择表更新,它才认为相邻站点不可达。每隔30秒,距离向量路由协议就要向相邻站点发送整个路由选
择表,使相邻站点的路由选择表得到更新。这样,它就能从别的站点(直接相连的或其他方式连接的)收集一个网络的列表,以便进行路由选择
。距离向量路由协议使用跳数作为度量值,来计算到达目的地要经过的路由器数。例如,R I P使用B e l l m a n - F o r d算法确定最短路
径,即只要经过最小的跳数就可到达目的地的线路。最大允许的跳数通常定为1 5。那些必须经过1 5个以上的路由器的终端被认为是不可到达
距离向量路由协议有如下几种: IP RIP、IPX RIP、A p p l e Talk RT M P和I G R P。
3、什么是链接状态路由协议?链接状态路由协议更适合大型网络,但由于它的复杂性,使得路由器需要更多的C P U资源。它能够在更短的时间内发现已经断了的链路或新连
接的路由器,使得协议的会聚时间比距离向量路由协议更短。通常,在1 0秒钟之内没有收到邻站的H E L LO报文,它就认为邻站已不可达。一
个链接状态路由器向它的邻站发送更新报文,通知它所知道的所有链路。它确定最优路径的度量值是一个数值代价,这个代价的值一般由链路
的带宽决定。具有最小代价的链路被认为是最优的。在最短路径优先算法中,最大可能代价的值几乎可以是无限的。如果网络没有发生任何变
化,路由器只要周期性地将没有更新的路由选择表进行刷新就可以了(周期的长短可以从3 0分钟到2个小时)。
链接状态路由协议有如下几种: IP OSPF、IPX NLSP和I S - I S。
4、一个路由器可以既使用距离向量路由协议,又使用链接状态路由协议吗?可以。每一个接口都可以配置为使用不同的路由协议;但是它们必须能够通过再分配路由来交换路由信息。
5、什么是访问表?访问表是管理者加入的一系列控制数据包在路由器中输入、输出的规则。它不是由路由器自己产生的。访问表能够允许或禁止数据包进入或输
出到目的地。访问表的表项是顺序执行的,即数据包到来时,首先看它是否是受第一条表项约束的,若不是,再顺序向下执行;如果它与第一条
表项匹配,无论是被允许还是被禁止,都不必再执行下面表项的检查了。每一个接口的每一种协议只能有一个访问表。&
Copyringht &
All Rights Reserved &&
深圳市安易科技有限公司&
深圳市南山区科技园软件技术园1208 联系电话:8
友情链接:前言1MagicNumber -& autoresizingMask -& autolayout
以上是纯手写代码所经历的关于页面布局的三个时期
在iphone1-iphone3gs时代 window的size固定为(320,480) 我们只需要简单计算一下相对位置就好了
在iphone4-iphone4s时代 苹果推出了retina屏 但是给了码农们非常大的福利:window的size不变
在iphone5-iphone5s时代 window的size变了(320,568) 这时autoresizingMask派上了用场(为啥这时候不用Autolayout?
因为还要支持ios5呗) 简单的适配一下即可
在iphone6+时代 window的width也发生了变化(相对5和5s的屏幕比例没有变化) 终于是时候抛弃autoresizingMask改用autolayout了(不用支持ios5了 相对于屏幕适配的多样性来说autoresizingMask也已经过时了)
那如何快速的上手autolayout呢? 说实话 当年ios6推出的同时新增了autolayout的特性 我看了一下官方文档和demo 就立马抛弃到一边了 因为实在过于的繁琐和啰嗦(有过经验的朋友肯定有同感)
直到iphone6发布之后 我知道使用autolayout势在必行了 这时想起了以前在浏览Github看到过的一个第三方库Masonry 在花了几个小时的研究使用后 我就将autolayout掌握了(重点是我并没有学习任何的官方文档或者其他的关于autolayout的知识) 这就是我为什么要写下这篇文章来推荐它的原因
Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布局 简洁明了 并具有高可读性 而且同时支持 iOS 和 Max OS X
我们先来看一段官方的sample code来认识一下Masonry
123[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).with.insets(padding);}];
看到block里面的那句话: make edges equalTo superview with insets通过链式的自然语言 就把view1给autolayout好了 是不是简单易懂?
使用看一下Masonry支持哪一些属性
1234567891011@property (nonatomic, strong, readonly) MASConstraint *@property (nonatomic, strong, readonly) MASConstraint *@property (nonatomic, strong, readonly) MASConstraint *@property (nonatomic, strong, readonly) MASConstraint *@property (nonatomic, strong, readonly) MASConstraint *@property (nonatomic, strong, readonly) MASConstraint *@property (nonatomic, strong, readonly) MASConstraint *@property (nonatomic, strong, readonly) MASConstraint *@property (nonatomic, strong, readonly) MASConstraint *centerX;@property (nonatomic, strong, readonly) MASConstraint *centerY;@property (nonatomic, strong, readonly) MASConstraint *
这些属性与NSLayoutAttrubute的对照表如下
NSAutoLayout
NSLayoutAttributeLeft
NSLayoutAttributeTop
NSLayoutAttributeRight
NSLayoutAttributeBottom
NSLayoutAttributeLeading
NSLayoutAttributeTrailing
NSLayoutAttributeWidth
NSLayoutAttributeHeight
NSLayoutAttributeCenterX
NSLayoutAttributeCenterY
NSLayoutAttributeBaseline
其中leading与left
trailing与right 在正常情况下是等价的 但是当一些布局是从右至左时(比如阿拉伯文?没有类似的经验) 则会对调 换句话说就是基本可以不理不用 用left和right就好了
在ios8发布后 又新增了一堆奇奇怪怪的属性(有兴趣的朋友可以去瞅瞅) Masonry暂时还不支持(不过你要支持ios6,ios7 就没必要去管那么多了)
下面进入正题(为了方便 我们测试的superView都是一个size为(300,300)的UIView)
下面 通过一些简单的实例来简单介绍如何轻松愉快的使用Masonry:
1. [基础] 居中显示一个view123456789101112131415- (void)viewDidLoad{
[super viewDidLoad];
UIView *sv = [UIView new];
[sv showPlaceHolder];
sv.backgroundColor = [UIColor blackColor];
[self.view addSubview:sv];
[sv mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.size.mas_equalTo(CGSizeMake(300, 300));
使用我之间写的 可以看到superview已经按照我们预期居中并且设置成了适当的大小
那么先看看这几行代码
12345678910111213141516UIView *sv = [UIView new];[self.view addSubview:sv];[sv mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.size.mas_equalTo(CGSizeMake(300, 300));}];
这里有两个问题要分解一下
首先在Masonry中能够添加autolayout约束有三个函数
123456789101112- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))
mas_makeConstraints 只负责新增约束 Autolayout不能同时存在两条针对于同一对象的约束 否则会报错
mas_updateConstraints 针对上面的情况 会更新在block中出现的约束 不会导致出现两个相同约束的情况
mas_remakeConstraints 则会清除之前的所有约束 仅保留最新的约束
三种函数善加利用 就可以应对各种情况了*/
其次 equalTo 和 mas_equalTo的区别在哪里呢? 其实 mas_equalTo是一个MACRO
12345#define mas_equalTo(...)
equalTo(MASBoxValue((__VA_ARGS__)))#define mas_greaterThanOrEqualTo(...)
greaterThanOrEqualTo(MASBoxValue((__VA_ARGS__)))#define mas_lessThanOrEqualTo(...)
lessThanOrEqualTo(MASBoxValue((__VA_ARGS__)))#define mas_offset(...)
valueOffset(MASBoxValue((__VA_ARGS__)))
可以看到 mas_equalTo只是对其参数进行了一个BOX操作(装箱) MASBoxValue的定义具体可以看看源代码 太长就不贴出来了
所支持的类型
除了NSNumber支持的那些数值类型之外 就只支持CGPoint CGSize UIEdgeInsets
介绍完这几个问题 我们就继续往下了 PS:刚才定义的sv会成为我们接下来所有sample的superView
2. [初级] 让一个view略小于其superView(边距为10)123456789101112131415161718UIView *sv1 = [UIView new];[sv1 showPlaceHolder];sv1.backgroundColor = [UIColor redColor];[sv addSubview:sv1];[sv1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(sv).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));
make.top.equalTo(sv).with.offset(10);
make.left.equalTo(sv).with.offset(10);
make.bottom.equalTo(sv).with.offset(-10);
make.right.equalTo(sv).with.offset(-10);
make.top.left.bottom.and.right.equalTo(sv).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));
*/}];
可以看到 edges 其实就是top,left,bottom,right的一个简化 分开写也可以 一句话更省事
那么为什么bottom和right里的offset是负数呢?
因为这里计算的是绝对的数值 计算的bottom需要小于sv的底部高度 所以要-10
同理用于right
这里有意思的地方是and和with
其实这两个函数什么事情都没做
1234567- (MASConstraint *)with {
return self;}- (MASConstraint *)and {
return self;}
但是用在这种链式语法中 就非常的巧妙和易懂 不得不佩服作者的心思(虽然我现在基本都会省略)
3. [初级] 让两个高度为150的view垂直居中且等宽且等间隔排列 间隔为10(自动计算其宽度)1234567891011121314151617int padding1 = 10;[sv2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.mas_equalTo(sv.mas_centerY);
make.left.equalTo(sv.mas_left).with.offset(padding1);
make.right.equalTo(sv3.mas_left).with.offset(-padding1);
make.height.mas_equalTo(@150);
make.width.equalTo(sv3);}];[sv3 mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.mas_equalTo(sv.mas_centerY);
make.left.equalTo(sv2.mas_right).with.offset(padding1);
make.right.equalTo(sv.mas_right).with.offset(-padding1);
make.height.mas_equalTo(@150);
make.width.equalTo(sv2);}];
这里我们在两个子view之间互相设置的约束 可以看到他们的宽度在约束下自动的被计算出来了
4. [中级] 在UIScrollView顺序排列一些view并自动计算contentSize123456789101112131415161718192021222324252627282930313233343536373839404142434445464748UIScrollView *scrollView = [UIScrollView new];scrollView.backgroundColor = [UIColor whiteColor];[sv addSubview:scrollView];[scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(sv).with.insets(UIEdgeInsetsMake(5,5,5,5));}];UIView *container = [UIView new];[scrollView addSubview:container];[container mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(scrollView);
make.width.equalTo(scrollView);}];int count = 10;UIView *lastView = nil;for ( int i = 1 ; i &= ++i ){
UIView *subv = [UIView new];
[container addSubview:subv];
subv.backgroundColor = [UIColor colorWithHue:( arc4random() % 256 / 256.0 )
saturation:( arc4random() % 128 / 256.0 ) + 0.5
brightness:( arc4random() % 128 / 256.0 ) + 0.5
[subv mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.and.right.equalTo(container);
make.height.mas_equalTo(@(20*i));
if ( lastView )
make.top.mas_equalTo(lastView.mas_bottom);
make.top.mas_equalTo(container.mas_top);
lastView =}[container mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(lastView.mas_bottom);}];
从scrollView的scrollIndicator可以看出 scrollView的内部已如我们所想排列好了
这里的关键就在于container这个view起到了一个中间层的作用 能够自动的计算uiscrollView的contentSize
5. [高级] 横向或者纵向等间隙的排列一组view很遗憾 autoLayout并没有直接提供等间隙排列的方法(Masonry的官方demo中也没有对应的案例) 但是参考案例3 我们可以通过一个小技巧来实现这个目的 为此我写了一个Category
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798@implementation UIView(Masonry_LJC)- (void) distributeSpacingHorizontallyWith:(NSArray*)views{
NSMutableArray *spaces = [NSMutableArray arrayWithCapacity:views.count+1];
for ( int i = 0 ; i & views.count+1 ; ++i )
UIView *v = [UIView new];
[spaces addObject:v];
[self addSubview:v];
[v mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo(v.mas_height);
UIView *v0 = spaces[0];
[v0 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left);
make.centerY.equalTo(((UIView*)views[0]).mas_centerY);
UIView *lastSpace = v0;
for ( int i = 0 ; i & views.count; ++i )
UIView *obj = views[i];
UIView *space = spaces[i+1];
[obj mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(lastSpace.mas_right);
[space mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(obj.mas_right);
make.centerY.equalTo(obj.mas_centerY);
make.width.equalTo(v0);
lastSpace =
[lastSpace mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self.mas_right);
}- (void) distributeSpacingVerticallyWith:(NSArray*)views{
NSMutableArray *spaces = [NSMutableArray arrayWithCapacity:views.count+1];
for ( int i = 0 ; i & views.count+1 ; ++i )
UIView *v = [UIView new];
[spaces addObject:v];
[self addSubview:v];
[v mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo(v.mas_height);
UIView *v0 = spaces[0];
[v0 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.mas_top);
make.centerX.equalTo(((UIView*)views[0]).mas_centerX);
UIView *lastSpace = v0;
for ( int i = 0 ; i & views.count; ++i )
UIView *obj = views[i];
UIView *space = spaces[i+1];
[obj mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(lastSpace.mas_bottom);
[space mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(obj.mas_bottom);
make.centerX.equalTo(obj.mas_centerX);
make.height.equalTo(v0);
lastSpace =
[lastSpace mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(self.mas_bottom);
}];}@end
简单的来测试一下
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647UIView *sv11 = [UIView new];UIView *sv12 = [UIView new];UIView *sv13 = [UIView new];UIView *sv21 = [UIView new];UIView *sv31 = [UIView new];sv11.backgroundColor = [UIColor redColor];sv12.backgroundColor = [UIColor redColor];sv13.backgroundColor = [UIColor redColor];sv21.backgroundColor = [UIColor redColor];sv31.backgroundColor = [UIColor redColor];[sv addSubview:sv11];[sv addSubview:sv12];[sv addSubview:sv13];[sv addSubview:sv21];[sv addSubview:sv31];[sv11 mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(@[sv12,sv13]);
make.centerX.equalTo(@[sv21,sv31]);
make.size.mas_equalTo(CGSizeMake(40, 40));}];[sv12 mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(70, 20));}];[sv13 mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(50, 50));}];[sv21 mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(50, 20));}];[sv31 mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(40, 60));}];[sv distributeSpacingHorizontallyWith:@[sv11,sv12,sv13]];[sv distributeSpacingVerticallyWith:@[sv11,sv21,sv31]];[sv showPlaceHolderWithAllSubviews];[sv hidePlaceHolder];
perfect! 简洁明了的达到了我们所要的效果
这里所用的技巧就是 使用空白的占位view来填充我们目标view的旁边 这点通过图上的空白标注可以看出来
小结通过以上5个案例 我觉得已经把Masonry的常用功能介绍得差不多了 以上五个例子的代码可以 如果你觉得意犹未尽呢 请下载官方的demo来学习
总而言之 Masonry是一个非常优秀的autolayout库 能够节省大量的开发和学习时间 尤其适合我这种纯代码的iOSer 在iPhone6发布后引发的适配潮中 Masonry一定可以助你一臂之力 :)

我要回帖

更多关于 steam喜加一在那里抽 的文章

 

随机推荐