iphone x 刘海适配适配纯代码怎么做

今天到手iPhone X很多应用不适配?苹果教你什么才是软件生态
今天到手iPhone X很多应用不适配?苹果教你什么才是软件生态
曹或均工作室
今天,苹果正式上市iPhone X,相信很多朋友都将会拿到属于自己的iPhone X。而由于苹果曾表示发售日在零售店会有现货可以购买(数量有限),因此国外不少果粉便开始在苹果直营店外排起长龙,准备彻夜等待iPhone X首发。在新加坡、日本、澳大利亚、美国等地,我们都看到了出现果粉们排队购买手机的盛况。据说,在全球多个国家,包括英国、澳大利亚、日本和中国等,苹果在线商店中iPhone X的预计发货时间都改善为3-4周。事实上,在iPhone X首批登陆的国家中,发货时间似乎都改善了,这包括欧洲、亚太地区和中东地区。这对于其他正在等待购买iPhone X的朋友来说,当然是一个好消息。有人戏称在国内市场,这是因为黄牛发现iPhone X价格炒不上去之后,纷纷退货,才让iPhone X的发货时间提前了。其实最大的原因相信还是iPhone X的产能提高了,生产了几个月了,各种零部件和流水线都趋于稳定了。这次的iPhone X不可不谓重大更新,其最大的变化莫过于iPhone X采用了全新的“刘海”异形屏。不用想也知道,这样屏幕变化必然带来的是很多应用的不适配。就像这样——这是使用iPhone 8一样的显示效果强行运行的结果,导致上下都有如此感人的黑边。在刚拿到iPhone X的时候,相信这也的情况不会少见。毕竟大多数人的手机中都会有一两个比较小众的软件会长期使用的。适配过的软件显示则是这样的(iPhone X截图不会有“刘海”显示)——新硬件上市,软件会有一个适配过程,这是非常常见的事情。还记得从iPhone 5s到iPhone 6/Plu的时候,分辨率和屏幕尺寸的提升使得很多应用都是强行拉升运行的,观感十分不好。而有的应用跟进的比较快,有的则是基本不当回事。小编印象最深刻的是中国电信官方APP,是直到iPhone 6s上市之后几个月,才适配的iPhone 6/Plus的分辨率。这次iPhone X想必不会出现这样的问题了,在iPhone X上市的前后几天,便有很多应用发布了新版本更新支持iPhone X。滴滴,网易云音乐,网易新闻等等,连小米这样的商城应用也是第一时间更新支持iPhone X,苹果的号召力可见一斑。虽然现在支持iPhone X的应用已经不少了,预计在接下来的几天还会有大量软件会更新,手持iPhone X的朋友可以留意一下。每次更新都是新感觉,手动斜眼。当然苹果公司也不是什么都不做的,他们在App Store专门开辟了为iPhone X优化的游戏和应用专栏。目前名单中的软件数量还比较少,但是相信很快就会有大量软件优化更新。有需要的朋友可以持续关注App Store中的iPhone X专栏。(就在你的App Store里面)相信随着iPhone X的正式到来,更多兼容iPhone X的优质应用会不断的出现,毕竟iPhone X的强大,还需要依托更多的应用来展现。最让小编期待的便是更多的AR应用,iOS 11带来的ARKit让iPhone具有了其他手机不具备的AR性能。但是到目前为止除了玩玩新鲜感,好像并没有什么AR应用可以引起广泛的关注。其实近两年不管是苹果还是安卓,在软件适配方面都比以前好太多了。新款硬件一出来,你日常用的一些软件基本上会马上适配,这是程序员们共同努力的结果。所以,当你拿到iPhone X发现有几个你常用的软件还不能正常显示,不要着急,给程序员哥哥们一点时间。话说不管怎么样,你等的时间肯定不会比安卓适配“全面屏”的应用的时间还要长。话说有用18:9“全面屏”手机的朋友么?应用适配情况现在怎样了?
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
曹或均工作室
百家号 最近更新:
简介: 原创作者
军事迷 文学爱好者 新闻撰稿人
作者最新文章iOS 纯代码适配方式 - 简书
iOS 纯代码适配方式
iPhone的机型和尺寸的对应关系:
很明显能看出这三种屏幕的尺寸宽高比是差不多的,因此可以在5的基础上,按比例放大来适配6和6Plus的屏幕.// 在AppDelegate.h中@property float autoSizeScaleX;@property float autoSizeScaleY;// 在AppDelegate.m中#define ScreenHeight [[UIScreen mainScreen] bounds].size.height#define ScreenWidth [[UIScreen mainScreen] bounds].size.width- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate];if(ScreenHeight & 480){ // 这里以(iPhone4S)为准myDelegate.autoSizeScaleX = ScreenWidth/320;myDelegate.autoSizeScaleY = ScreenHeight/568;}else{myDelegate.autoSizeScaleX = 1.0;myDelegate.autoSizeScaleY = 1.0;}}因为iPhone4s屏幕的高度是480, 因此当屏幕尺寸大于iPhone4时, autoSizeScaleX和autoSizeScaleY即为当前屏幕和iPhone5尺寸的宽高比, 比如,如果是5,autoSizeScaleX=1,autoSizeScaleY=1;如果是6,autoSizeScaleX=1.171875,autoSizeScaleY=1.;如果是6Plus,autoSizeScaleX=1.29375,autoSizeScaleY=1.2957;现在我们获取了比例关系后,先来看一下如何解决代码设置界面时的适配。CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)这个方法使我们常用的设置尺寸的方法,现在我设置了一个类似于这样的方法。在.m文件中CG_INLINE CGRectTS_CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height){AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate];CGRrect.origin.x = x * myDelegate.autoSizeScaleX;rect.origin.y = y * myDelegate.autoSizeScaleY;rect.size.width = width * myDelegate.autoSizeScaleX;rect.size.height = height * myDelegate.autoSizeScaleY;}当我们使用的时候直接这样做UIImageView *imageview = [[UIImageView alloc] initWithFrame:TS_CGRectMake(100, 100, 50, 50)];这样我们得出的就是转换后的坐标了. 这样,这个imageview在5,6和6Plus的位置和尺寸比例都是一样的. 妈妈再也不用担心屏幕的适配了.如果整个项目做完后才开始做适配的话这个方法的优势就体现出来了,面对几十个工程文件,只需自定义并且替换你的CGRectMake方法,再加上storyBoradAutoLay这个方法就瞬间完成大部分甚至全部的适配,如果遇到tableView的或者其他的手动调整一下即可.
2年多实际开发经验,仍觉得自己了解的还不是很深刻,希望大家多多指教,必虚心学习,多谢!iOS开发屏幕适配,纯代码是如何实现的? - CSDN博客
iOS开发屏幕适配,纯代码是如何实现的?
【iOS开发】多屏尺的自动适配&AutoLayout&(纯代码方式)
关于AutoLayout,最早从iOS6开始引入使用。
主要功能是使用约束,对视图进行相对布局,以适应不同屏尺的变换。
网上大量的资料都在介绍xib和storyboard,如何使用AutoLayout,说纯代码使用AutoLayout进行UI布局的越来越少。对于我这个习惯了代码UI布局的人,写个备忘:
AutoLayout是什么?
使用一句Apple的官方定义的话
AutoLayout是一种基于约束的,描述性的布局系统。 Auto Layout Is a Constraint-Based, Descriptive Layout System.
基于约束 - 和以往定义frame的位置和尺寸不同,AutoLayout的位置确定是以所谓相对位置的约束来定义的,比如x坐标为superView的中心,y坐标为屏幕底部上方10像素等
描述性 - 约束的定义和各个view的关系使用接近自然语言或者可视化语言(稍后会提到)的方法来进行描述
布局系统 - 即字面意思,用来负责界面的各个元素的位置。
总而言之,AutoLayout为开发者提供了一种不同于传统对于UI元素位置指定的布局方法。以前,不论是在IB里拖放,还是在代码中写,每个UIView都会有自己的frame属性,来定义其在当前视图中的位置和尺寸。使用AutoLayout的话,就变为了使用约束条件来定义view的位置和尺寸。这样的最大好处是一举解决了不同分辨率和屏幕尺寸下view的适配问题,另外也简化了旋转时view的位置的定义,原来在底部之上10像素居中的view,不论在旋转屏幕或是更换设备(iPad或者iPhone5或者以后可能出现的mini
iPad)的时候,始终还在底部之上10像素居中的位置,不会发生变化。 总结
使用约束条件来描述布局,view的frame会依据这些约束来进行计算 Describe the layout with constraints, and frames are calculated automatically.
AutoLayout和Autoresizing Mask的区别
Autoresizing Mask是我们的老朋友了…如果你以前一直是代码写UI的话,你肯定写过UIViewAutoresizingFlexibleWidth之类的枚举;如果你以前用IB比较多的话,一定注意到过每个view的size inspector中都有一个红色线条的Autoresizing的指示器和相应的动画缩放的示意图,这就是Autoresizing
Mask。在iOS6之前,关于屏幕旋转的适配和iPhone,iPad屏幕的自动适配,基本都是由Autoresizing Mask来完成的。但是随着大家对iOS app的要求越来越高,以及已经以及今后可能出现的多种屏幕和分辨率的设备来说,Autoresizing Mask显得有些落伍和迟钝了。AutoLayout可以完成所有原来Autoresizing Mask能完成的工作,同时还能够胜任一些原来无法完成的任务,其中包括:
AutoLayout可以指定任意两个view的相对位置,而不需要像Autoresizing Mask那样需要两个view在直系的view hierarchy中。
AutoLayout不必须指定相等关系的约束,它可以指定非相等约束(大于或者小于等);而Autoresizing Mask所能做的布局只能是相等条件的。
AutoLayout可以指定约束的优先级,计算frame时将优先按照满足优先级高的条件进行计算。
Autoresizing Mask是AutoLayout的子集,任何可以用Autoresizing Mask完成的工作都可以用AutoLayout完成。AutoLayout还具备一些Autoresizing Mask不具备的优良特性,以帮助我们更方便地构建界面。
AutoLayout基本使用方法
Interface Builder
这部分网上大量的教程,都是说的这个
手动使用API添加约束
iOS6中新加入了一个类:NSLayoutConstraint,一个形如这样的约束
item1.attribute = multiplier ? item2.attribute + constant
对应的代码为
[NSLayoutConstraint
constraintWithItem:button
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&attribute:NSLayoutAttributeBottom
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&relatedBy:NSLayoutRelationEqua
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&toItem:superview
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&attribute:NSLayoutAttributeBottom
&&&&&&&&&&&&&&&&&&&&&&&&&&&&multiplier:1.0
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&constant:-padding]
这对应的约束是“button的底部(y) = superview的底部 -10”。
在创建约束之后,需要将其添加到作用的view上。UIView(当然NSView也一样)加入了一个新的实例方法:
-(void)addConstraint:(NSLayoutConstraint *)
用来将约束添加到view。在添加时唯一要注意的是添加的目标view要遵循以下规则:
对于两个同层级view之间的约束关系,添加到他们的父view上
对于两个不同层级view之间的约束关系,添加到他们最近的共同父view上
对于有层次关系的两个view之间的约束关系,添加到层次较高的父view上
可以通过-setNeedsUpdateConstraints和-layoutIfNeeded两个方法来刷新约束的改变,使UIView重新布局。这和CoreGraphic的-setNeedsDisplay一套东西是一样的~
Visual Format Language 可视格式语言
UIKit团队这次相当有爱,估计他们自己也觉得新加约束的API名字太长了,因此他们发明了一种新的方式来描述约束条件,十分有趣。这种语言是对视觉描述的一种抽象,大概过程看起来是这样的: accept按钮在cancel按钮右侧默认间距处&
最后使用VFL(Visual Format Language)描述变成这样:
[NSLayoutConstraint
constraintsWithVisualFormat:@\\&[cancelButton]-[acceptButton]\&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&options:0
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&metrics:nil
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&views:viewsDictionary];
其中viewsDictionary是绑定了view的名字和对象的字典,对于这个例子可以用以下方法得到对应的字典:
*cancelButton = ...
*acceptButton = ...
viewsDictionary
= NSDictionaryOfVariableBindings(cancelButton,acceptButton);
生成的字典为
{ acceptButton = &&; cancelButton = &&; }
当然,不嫌累的话自己手写也未尝不可。现在字典啊数组啊写法相对简化了很多了,因此也不复杂。关于Objective-C的新语法,可以参考我之前的一篇WWDC 2012笔记:。 在view名字后面添加括号以及连接处的数字可以赋予表达式更多意义,以下进行一些举例:
[cancelButton(72)]-12-[acceptButton(50)]
取消按钮宽72point,accept按钮宽50point,它们之间间距12point
[wideView(&=60@700)]
wideView宽度大于等于60point,该约束条件优先级为700(优先级最大值为1000,优先级越高的约束越先被满足)
V:[redBox][yellowBox(==redBox)]
竖直布局,先是一个redBox,其下方紧接一个宽度等于redBox宽度的yellowBox
H:|-[Find]-[FindNext]-[FindField(&=20)]-|
水平布局,Find距离父view左边缘默认间隔宽度,之后是FindNext距离Find间隔默认宽度;再之后是宽度不小于20的FindField,它和FindNext以及父view右边缘的间距都是默认宽度。(竖线'|‘ 表示superview的边缘)
容易出现的错误
因为涉及约束问题,因此约束模型下的所有可能出现的问题这里都会出现,具体来说包括两种:
Ambiguous Layout 布局不能确定
Unsatisfiable Constraints 无法满足约束
布局不能确定指的是给出的约束条件无法唯一确定一种布局,也即约束条件不足,无法得到唯一的布局结果。这种情况一般添加一些必要的约束或者调整优先级可以解决。无法满足约束的问题来源是有约束条件互相冲突,因此无法同时满足,需要删掉一些约束。两种错误在出现时均会导致布局的不稳定和错误,Ambiguous可以被容忍并且选择一种可行布局呈现在UI上,Unsatisfiable的话会无法得到UI布局并报错。
对于不能确定的布局,可以通过调试时暂停程序,在debugger中输入
po [[UIWindow keyWindow] _autolayoutTrace]
来检查是否存在Ambiguous Layout以及存在的位置,来帮助添加条件。另外还有一些检查方法,来查看view的约束和约束状态:
[view constraintsAffectingLayoutForOrientation/Axis: NSLayoutConstraintOrientationHorizontal/Vertical]
[view hasAmbiguousLayout]
[view exerciseAmbiguityInLayout]
动画是UI体验的重要部分,更改布局以后的动画也非常关键。说到动画,Core Animation又立功了..自从CA出现以后,所有的动画效果都非常cheap,在auto layout中情况也和collection view里一样,很简单(可以参考),只需要把layoutIfNeeded放到animation block中即可~
animateWithDuration:0.5 animations:^{
layoutIfNeeded];
纯净代码UI正常布局后,添加autolayout就可以了,调整相当方便
这是一段水平居中,垂直并列的4个按钮 布局代码
setTranslatesAutoresizingMaskIntoConstraints
&是为no,开启AutoLayou.
&&&&//-----autoLayout
&&&&[_btn_1&setTranslatesAutoresizingMaskIntoConstraints:NO];
&&&&[_btn_2&setTranslatesAutoresizingMaskIntoConstraints:NO];
&&&&[_btn_3&setTranslatesAutoresizingMaskIntoConstraints:NO];
&&&&[_btn_4&setTranslatesAutoresizingMaskIntoConstraints:NO];
&&&&CGSize&winSize = [[iHappySDKSingle&shareSingle]&getScreenSize];
&&&&CGFloat&tpo =&_btn_1.frame.origin.y;
&&&&CGFloat&hpod =&_btn_1.frame.origin.x;
&&&&CGFloat&btnH =&_btn_1.frame.size.height;
&&&&CGFloat&vpod = winSize.width*0.15-btnH;
&&&&NSNumber* tp = [NSNumber&numberWithFloat:tpo];
&&&&NSNumber* hd = [NSNumber&numberWithFloat:hpod];
&&&&NSNumber* vd = [NSNumber&numberWithFloat:vpod];
&&&&NSNumber* bh = [NSNumber&numberWithFloat:btnH];
&&&&NSNumber* btm = [NSNumber&numberWithFloat:vpod*2];
&&&&NSDictionary&*dict1 =&NSDictionaryOfVariableBindings(_btn_1,_btn_2,_btn_3,_btn_4);
&&&&NSDictionary&*metrics =@{@&hPadding&:hd,@&vPadding&:vd,@&top&:tp,@&btm&:btm,@&btnHeight&:bh};
&&&&NSString&*vfl1 =&@&|-hPadding-[_btn_1]-hPadding-|&;
[self.view&addConstraints:[NSLayoutConstraint&constraintsWithVisualFormat:vfl1
&&options:0
&&metrics:metrics
views:dict1]];
&&&&NSString&*vfl2 =&@&|-hPadding-[_btn_2]-hPadding-|&;
[self.view&addConstraints:[NSLayoutConstraint&constraintsWithVisualFormat:vfl2
&&options:0
&&metrics:metrics
views:dict1]];
&&&&NSString&*vfl3 =&@&|-hPadding-[_btn_3]-hPadding-|&;
[self.view&addConstraints:[NSLayoutConstraint&constraintsWithVisualFormat:vfl3
&&options:0
&&metrics:metrics
views:dict1]];
&&&&NSString&*vfl4 =&@&|-hPadding-[_btn_4]-hPadding-|&;
[self.view&addConstraints:[NSLayoutConstraint&constraintsWithVisualFormat:vfl4
&&options:0
&&metrics:metrics
views:dict1]];
&&&&NSString&*vfl5 =&@&V:|-(&=top)-[_btn_1(btnHeight)]-vPadding-[_btn_2(btnHeight)]-vPadding-[_btn_3(btnHeight)]-vPadding-[_btn_4(btnHeight)]-(&=btm)-|&;
&&&&if&(_btn_1.hidden) {
&&&&&&&&vfl5 =&@&V:|-(&=top)-[_btn_2(btnHeight)]-vPadding-[_btn_3(btnHeight)]-vPadding-[_btn_4(btnHeight)]-(&=btm)-|&;
[self.view&addConstraints:[NSLayoutConstraint&constraintsWithVisualFormat:vfl5
&&options:0
&&metrics:metrics
views:dict1]];
纯净代码UI正常布局后,增加一个函数,进行自动布局
水平居中布局:NSLayoutAttributeCenterX
垂直居中布局:NSLayoutAttributeCenterY
以及后面的布局切换动画。
- (void)setAutoLayoutForKuang:(UIView*)imgv
&&&&UIView&* view =&self;
&&&&[imgv&setTranslatesAutoresizingMaskIntoConstraints:NO];
&&&&NSDictionary&*dict1 =&NSDictionaryOfVariableBindings(imgv);
&&&&NSDictionary&*metrics =&@{@&width&:[NSNumbernumberWithFloat:imgv.frame.size.width],
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@&height&:[NSNumber&numberWithFloat:imgv.frame.size.height],
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@&top&:[NSNumber&numberWithFloat:imgv.frame.origin.y]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&};
&&&&NSString&*vfl1 =&@&[imgv(width)]&;
[view&addConstraints:[NSLayoutConstraint&constraintsWithVisualFormat:vfl1
&&options:0
&&metrics:metrics
views:dict1]];
&&&&NSString&*vfl2 =&@&V:[imgv(height)]&;
[view&addConstraints:[NSLayoutConstraint&constraintsWithVisualFormat:vfl2
&&options:0
&&metrics:metrics
views:dict1]];
&&&&[view&addConstraint:[NSLayoutConstraint&constraintWithItem:imgvattribute:NSLayoutAttributeCenterX&relatedBy:NSLayoutRelationEqual
toItem:viewattribute:NSLayoutAttributeCenterX&multiplier:1&constant:0]];
&&&&[view&addConstraint:[NSLayoutConstraint&constraintWithItem:imgvattribute:NSLayoutAttributeCenterY&relatedBy:NSLayoutRelationEqual
toItem:viewattribute:NSLayoutAttributeCenterY&multiplier:1&constant:0]];
&&&&//animation
&&&&[UIView&animateWithDuration:0.25&animations:^{
&&&&&&&&[imgv&layoutIfNeeded];
-----------------------------------------
网上相关文章:
-----------------------------------------
1、&&&&推荐
2、&&&&&&此文包含有一个demo()
不是朋友在发愁手动些这些类似脚本的字符:
现在推荐一个开源库给大家
本文已收录于以下专栏:
相关文章推荐
看了网上有很多屏幕适配的文章,大多是用iOS的相对布局来实现屏幕适配(autoLayout,或Masonry)。
一些文章主要解决,iphone6/6p刚出来时,以前只解决屏幕高度适配,现在也要解决...
iPad横竖屏代码适配
纯代码实现ipad横屏竖屏的适配
原因是没有Retina4对应的启动图片,解决方法很简单,就是把Retina4对应的图片给补上就只可以了
这种都是小细节问题!!!!!!!
从初代iPhone3GS到现如今的iPhone6(+),屏幕尺寸、分辨率、像素密度都在在不断增大。如何适配不同的屏幕尺寸,使UI更加协调美观,这给iPhone/iOS应用开发者带来了挑战。
本文结合个...
参考链接 : iPhone屏幕尺寸、分辨率及适配
  
  在IOS界面开发中,我们一般是使用pt(Point)来作为View的单位,它是一个标准的长度单位,1pt=1/72英寸
  而px即为我们所...
关于苹果iPhone 6s的屏幕参数相信大家都不会陌生,尺寸为4.7英寸,1334 x 750的分辨率使其ppi达到326
sp 与 px 的换算公式:sp*ppi/160 = px
总结得出:
...
下面说一下我个人对Auto Layout的见解:
1.当你对一个ViewA使用Auto Layout的时候,系统将会只使用Auto Layout中的条件来限制ViewA,而你原先对这个ViewA...
1、屏幕尺寸
通常所说的iPhone3GS屏幕尺寸为3.5英寸、iPhone4屏幕尺寸为4英寸,指的是显示屏对角线的长度。
2、iOS尺寸单位
1) px:
像素,是物理屏幕显示的基本单位,即使在...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
标签:至少1个,最多5个
简化iOS应用使用纯代码机型自适应布局的工作,使用一种简洁高效的语法替代NSLayoutConstraints.
项目简议: 如果再看到关于纯代码,xib或storyboard,使用哪种方式进行UI布局更合适的讨论,请推荐他们先试用下 Masonry. Masonry,像xib一样快速,同时拥有作为纯代码方式的灵活性 -- github关注度 7800 + 是有原因的!
使用 CocoaPods 安装
pod 'Masonry'
推荐在你的在 prefix.pch 中引入头文件:
// 定义这个常量,就可以在使用Masonry不必总带着前缀 `mas_`:
#define MAS_SHORTHAND
// 定义这个常量,以支持在 Masonry 语法中自动将基本类型转换为 object 类型:
#define MAS_SHORTHAND_GLOBALS
#import "Masonry.h"
初始Masonry
这是使用MASConstraintMaker创建的约束:
/* 注意:view1应首先添加为某个视图的子视图,superview是一个局部变量,指view1的父视图. */
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(superview.mas_top).offset(padding.top);
make.left.equalTo(superview.mas_left).offset(padding.left);
make.bottom.equalTo(superview.mas_bottom).offset(-padding.bottom);
make.right.equalTo(superview.mas_right).offset(-padding.right);
甚至可以更短:
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).insets(padding);
不止可以表达相等关系
.equalTo 等价于 NSLayoutRelationEqual
.lessThanOrEqualTo 等价于 NSLayoutRelationLessThanOrEqual
.greaterThanOrEqualTo 等价于 NSLayoutRelationGreaterThanOrEqual
这三个表达相等关系的语句,可以接受一个参数;此参数可以为以下任意一个:
1. MASViewAttribute
make.centerX.lessThanOrEqualTo(view2.mas_left);
MASViewAttribute
NSLayoutAttribute
view.mas_left
NSLayoutAttributeLeft
view.mas_right
NSLayoutAttributeRight
view.mas_top
NSLayoutAttributeTop
view.mas_bottom
NSLayoutAttributeBottom
view.mas_leading
NSLayoutAttributeLeading
view.mas_trailing
NSLayoutAttributeTrailing
view.mas_width
NSLayoutAttributeWidth
view.mas_height
NSLayoutAttributeHeight
view.mas_centerX
NSLayoutAttributeCenterX
view.mas_centerY
NSLayoutAttributeCenterY
view.mas_baseline
NSLayoutAttributeBaseline
2. UIView/NSView
如果你需要 view.left 大于或等于label.left:
// 下面两个约束是完全等效的.
make.left.greaterThanOrEqualTo(label);
make.left.greaterThanOrEqualTo(label.mas_left);
3. NSNumber
自适应布局允许将宽度或高度设置为固定值.如果你想要给视图一个最小或最大值,你可以这样:
//width &= 200 && width &= 400
make.width.greaterThanOrEqualTo(@200);
make.width.lessThanOrEqualTo(@400)
但是自适应布局不支持将 left,right, centerY等设为固定值.如果你给这些属性传递一个常量, Masonry会自动将它们转换为相对于其父视图的相对值:
//creates view.left = view.superview.left + 10
make.left.lessThanOrEqualTo(@10)
除了使用 NSNumber 外,你可以使用基本数据类型或者结构体来创建约束:
make.top.mas_equalTo(42);
make.height.mas_equalTo(20);
make.size.mas_equalTo(CGSizeMake(50, 100));
make.edges.mas_equalTo(UIEdgeInsetsMake(10, 0, 10, 0));
make.left.mas_equalTo(view).mas_offset(UIEdgeInsetsMake(10, 0, 10, 0));
4. NSArray
一个数组,里面可以混合是前述三种类型的任意几种:
// 表达三个视图等高的约束.
make.height.equalTo(@[view1.mas_height, view2.mas_height]);
make.height.equalTo(@[view1, view2]);
make.left.equalTo(@[view1, @100, view3.right]);
约束的优先级
.priority 允许你指定一个精确的优先级,数值越大优先级越高.最高1000.
.priorityHigh 等价于 UILayoutPriorityDefaultHigh.优先级值为 750.
.priorityMedium 介于高优先级和低优先级之间,优先级值在 250~750之间.
.priorityLow 等价于 UILayoutPriorityDefaultLow, 优先级值为 250.
优先级可以在约束的尾部添加:
make.left.greaterThanOrEqualTo(label.mas_left).with.priorityLow();
make.top.equalTo(label.mas_top).with.priority(600);
等比例自适应
.multipliedBy
允许你指定一个两个视图的某个属性等比例变化
item1.attribute1 = multiplier × item2.attribute2 + constant,此为约束的计算公式, .multipliedBy本质上是用来限定 multiplier的
注意,因为编程中的坐标系从父视图左上顶点开始,所以指定基于父视图的left或者top的multiplier是没有意义的,因为父视图的left和top总为0.
如果你需要一个视图随着父视图的宽度和高度,位置自动变化,你应该同时指定 right,bottom,width,height与父视图对应属性的比例(基于某个尺寸下的相对位置计算出的比例),并且constant必须为0.
// 指定宽度为父视图的 1/4.
make.width.equalTo(superview).multipliedBy(0.25);
Masonry提供了一些工具方法来进一步简化约束的创建.
edges 边界
//使 top, left, bottom, right等于 view2
make.edges.equalTo(view2);
//使 top = superview.top + 5, left = superview.left + 10,
bottom = superview.bottom - 15, right = superview.right - 20
make.edges.equalTo(superview).insets(UIEdgeInsetsMake(5, 10, 15, 20))
// 使宽度和高度大于或等于 titleLabel
make.size.greaterThanOrEqualTo(titleLabel)
//使 width = superview.width + 100, height = superview.height - 50
make.size.equalTo(superview).sizeOffset(CGSizeMake(100, -50))
center 中心
//使 centerX和 centerY = button1
make.center.equalTo(button1)
//使 centerX = superview.centerX - 5, centerY = superview.centerY + 10
make.center.equalTo(superview).centerOffset(CGPointMake(-5, 10))
你可以使用链式语法来增强代码可读性:
// 除top外,其他约束都与父视图相等.
make.left.right.bottom.equalTo(superview);
make.top.equalTo(otherView);
有时,你需要修改已经存在的约束来实现动画效果或者移除/替换已有约束.在 Masonry 中,有几种不同的更新视图约束的途径:
1. References 引用
你可以把 Masonry 语法返回的约束或约束数组,存储到一个局部变量或者类的属性中,以供后续操作某个约束.
// 声明属性
@property (nonatomic, strong) MASConstraint *topC
// when making constraints
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
self.topConstraint = make.top.equalTo(superview.mas_top).with.offset(padding.top);
make.left.equalTo(superview.mas_left).with.offset(padding.left);
// 然后你就可以操作这个属性.
[self.topConstraint uninstall];
2. mas_updateConstraints
如果你只是想添加新的约束,你可以使用便利方法mas_updateConstraints,不需要使用 mas_makeConstraints. mas_updateConstraints,不会移除已经存在的约束(即使新旧约束间相互冲突).
// 重写视图的updateConstraints方法: 这是Apple推荐的添加/更新约束的位置.
// 这个方法可以被多次调用以响应setNeedsUpdateConstraints方法.
// setNeedsUpdateConstraints 可以被UIKit内部调用或者由开发者在自己的代码中调用以更新视图约束.
- (void)updateConstraints {
[self.growingButton mas_updateConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self);
make.width.equalTo(@(self.buttonSize.width)).priorityLow();
make.height.equalTo(@(self.buttonSize.height)).priorityLow();
make.width.lessThanOrEqualTo(self);
make.height.lessThanOrEqualTo(self);
//根据apple机制,最后应调用父类的updateConstraints方法.
[super updateConstraints];
3. mas_remakeConstraints
mas_remakeConstraints与mas_updateConstraints相似,不同之处在于: mas_remakeConstraints 会先移除视图上已有的约束,再去创建新的约束.
- (void)changeButtonPosition {
[self.button mas_remakeConstraints:^(MASConstraintMaker *make) {
make.size.equalTo(self.buttonSize);
if (topLeft) {
make.top.and.left.offset(10);
make.bottom.and.right.offset(-10);
4 收藏&&|&&22
你可能感兴趣的文章
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到微博?
我要该,理由是:

我要回帖

更多关于 ios纯代码适配 的文章

 

随机推荐