如何对使用了ios autolayout 动画的UIView添加动画

谈StoryBoard上AutoLayout的约束动画 - 简书
下载简书移动应用
写了8770字,被315人关注,获得了298个喜欢
谈StoryBoard上AutoLayout的约束动画
以前写iOS的view动画,都在代码上直接实现,如放大缩小、转移、旋转等等。现在使用了Storyboard布局后,多是对IUView进行AutoLayout的约束,然而再在代码中对UIView的frame进行改修实现动画显得累赘还可能因为约束被破坏引发不可预知的布局错乱。
那么,我们可以利用AutoLayout的约束对UIView做相应的动画处理,可以满足我下我们app的简单需求。
1.先看一下需求图
2.图上的需求点如下
用户头像的颜色条从头像边缘延伸.
用户的昵称在颜色调延伸之后渐变出现。
这里特别提一下,Android开发当中有一种相对布局平移动画,如果是相对父控件X或Y轴的负数开始平移到正数,这个移动的View是从父控件的边沿滑出,也就是说负数部分是一直隐藏的,无论这个负数有多小。而iOS的AutoLayout的相对约束尽管为负数,只要是在相对控件图层的排列上方都是不被隐藏的,就算是在相对控件图层的下方也只能被相对控件遮挡一部分大小。
因此,约束动画显得更加必要了。
设置颜色条距离右边的底色背景view的约束。
在viewDidLoad方法后执行约束变更。
约束动画完成后再回调的block中实现昵称渐变显示。
Step Process:
布局页面在Xcode中拉上外边距约束。
代码中初始化3条颜色条的位置关系。
-(void)initUI{
self.view.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:0.8];
self.prograss1MarginRight.constant = self.prograss1Iv.frame.size.width*2-10;
self.prograss2MarginRight.constant = self.prograss2Iv.frame.size.width*2-10;
self.prograss3MarginRight.constant = self.prograss3Iv.frame.size.width*2-10;
self.userName1Lb.alpha = 0;
self.userName2Lb.alpha = 0;
self.userName3Lb.alpha = 0;
self.dayTextLb.layer.cornerRadius = 7;
self.dayTextLb.layer.masksToBounds = YES;
self.wordTextLb.layer.cornerRadius = 7;
self.wordTextLb.layer.masksToBounds = YES;
在viewDidAppear调用动画,注意要在viewDidLoad之后调用。
最终实现的效果图如下:
Demo代码地址:
微信公众号:minggo_dev
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
简书程序员大本营
投稿须知:
1.本专题仅收录与程序有关的文章。
2.请在代码框里写代码,尽量保证可看性。
关注简书官...
· 87048人关注
分享 iOS 开发的知识,解决大家遇到的问题,讨论iOS开发的前沿,欢迎大家投稿~
· 18231人关注
专题内容主要包括OC、swift等涉及到iOS开发进阶的内容。
swift可以关注下我的另一个专题:
swift开发...
· 14446人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:iOS UIView动画实践(一):揭开Animation的神秘面纱
发表于 15:20|
作者付宇轩
摘要:无论什么事物,长得好看总会更吸引目光,App同样也不例外,一款面相不错的App就算功能已经被轮子千百遍,依然会有人买账。本文是UIView Animation的第一篇,从极简的概念开始,为大家揭开Animation的神秘面纱。
在一个看脸的社会中,不论什么事物,长得好看总是能多吸引一些目光。App同样不例外,一款面相不错的App就算功能已经被轮子千百遍,依然会有人买账,理由就是看得顺眼,于是平面设计人员越来越被重视。白驹过隙,斗转星移,人们已然不满足于静态的美感,于是动态的用户体验应运而生,平面设计人员捉襟见肘,是我们程序员出马的时候了。
这篇文章是UIView Animation的第一篇,从极简的概念开始,为大家揭开Animation的神秘面纱。我们以一个登录界面为例。美丽的太阳,婀娜的云,还有几个小山包,中间静躺着用户名、密码输入框和登录按钮。搁以前,这个界面许是会亮瞎眼现如今尼玛狗都嫌。所以我们的目标是赋予这个界面生命力。
注意:本文章基于Swift 2.0和Xcode 7 Beta 2编写。登录界面中的所有元素都已经连接到了代码中(outlet),在这个示例中我们先不使用Auto
Layout和SizeClasses。
会动的输入框
我们的第一个场景应该是这样。用户打开App,启动画面过后显示登录界面,此时屏幕上还没有用户名和密码的输入框,下一秒他们从屏幕左侧飘然而至。
我们需要在登录界面还没有展现给用户的时候把用户名和密码的输入框移至屏幕外面。打开ViewController.swift,在viewWillAppear()方法中添加以下代码:
self.username.center.x -= self.view.bounds.width
self.password.center.x -= self.view.bounds.width
这两行代码使用户名、密码输入框移出屏幕外,这里可以使用简单暴力的方式,直接让center的x减去屏幕宽度。
我们在viewDidAppear()方法中添加以下代码:
UIView.animateWithDuration(0.5, animations: {
self.username.center.x += self.view.bounds.width
self.password.center.x += self.view.bounds.width
animationWithDuration(_:animations:)是UIView的类方法,从方法名就可以看出,该方法可使UIView动起来。它有两个参数:
duration:动画的持续时间。
animation:动画闭包,在这个闭包中你可以改变UIView的各种动画属性。
因为该方法是一个类方法,所以在闭包中你可以同时改变多个views的动画属性。所以在上述代码中,同时改变了用户名和密码输入框的位置。编译运行,我们可以看到如下效果:&
& & & & & & & & & & &
& & & & & & & &
但是由于两个输入框是同时从屏幕外滑入,略显呆板,所以我们用另一个方法再来润色一下。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章只需一步,快速开始
只需一步, 快速开始
后使用快捷导航没有帐号?
总共128条微博动态微博:
查看: 20509|回复: 30
积分金钱广播
&&使用xib、storybard、纯代码开发项目,这三种方法本人都尝试过。纯代码格式写的好,非常容易读、理解。合作开发也确实比storyboard方便,不需要像xib、storyboard那样经常切换几个界面,经常为了一个属性连线而报错,或者连线错误,纯代码编写易控制,易读。xib一般都是与代码混合编写,多用于自定义单元格之类的视图。使用storyboard整个应用流程,结构显得非常清楚,开发迅捷,但是自定义视图不是特别方便,比如自定义一个遮罩HUD视图。storyboard开发非常快,特别配合sizeclass、autolayout来适配6.0、7.0、8.0各种系统版本,4、5、6、6p各种屏幕尺寸非常之简单。强烈推荐使用storyboard+autolayout来开发,苹果的意愿也是如此。这里说一些storyboard和autolayout上的一些使用小技巧,也是对我前面部分工作的总结吧。
一、storyboard上的小技巧:
1、同时添加多个outlet
在IB中,选中一个view并右键点击,将会出现灰色的HUD,可以在其上方便地拖拉或设定事件和outlet。你可以同时打开多个这样的面板来一 次性添加所有outlet。右键点击面板,随便拖动一下面板,然后再打开另一个。你会发现前一个面板也留下来了,这样你就可以方便地进行拖拽设定了。
Center.jpg (94.26 KB, 下载次数: 0)
23:31 上传
2、多个Outlet HUD
当然,对于成组和行为类似的IBOutlet,应该直接使用IBOutletCollection来进行处理会更方便。
Center.jpg (16.22 KB, 下载次数: 0)
23:31 上传
Center.jpg (590.64 KB, 下载次数: 0)
23:31 上传
3、option键的妙用
(1)、可视化坐标距离
选中一个label,然后按住option键并将鼠标移动到其他label上试试?你可以发现view之间的距离都以很容易理解的方式显示出来了。不仅是同层次的view,被选中view与其他层次的view之间的距离关系也可以同样显示。
Center.jpg (2.19 MB, 下载次数: 0)
23:31 上传
(2)、控件复制
选中一个label,然后按住option键,并用鼠标按住它拖动到另一个位置,结果有了两label,新的label和原来label属性相同,比cmd+c、cmd+v好用吧。
4、添加辅助线
双击某个view,然后Cmd+Shift+-或者Cmd+Shift+|即可在选中的view上添加一条水平或者垂直中心的辅助线。当然这个辅助线是可以随意移动的。如果干过设计的同学肯定明白这个的意义了,在之后的对其和设计变更的时候都有重要的参考价值。
Center.jpg (50.24 KB, 下载次数: 0)
23:31 上传
5.添加自定义视图
如图这样,把它当做xib来处理就行了。不用额外创建xib了,方便实用吧。
Center.jpg (342.12 KB, 下载次数: 0)
23:31 上传
6.User Undefined Runtime Attributes妙用
例如在storyboard上设置这类属性,圆角。
keypath写上你想要设置的属性,根据名字就知道它支持访问对象的指定属性的字符串序列,type就是属性的类型,value还支持颜色哦。
Center.jpg (222.29 KB, 下载次数: 0)
23:31 上传
Center.jpg (29.39 KB, 下载次数: 0)
23:31 上传
Center.jpg (126.3 KB, 下载次数: 0)
23:31 上传
7.使view的size与view的content相适应
选中任意的一个view,然后Editor-&Size to Fit Content,或者简单的按 ⌘=
接着就会按照下面的规则对选中view的Size做出与之Content对应的适应:
(1)ImageView/Button的size会设置为图像的原始size(最常见的用法)。
(2)Label/Button的size会被设置为与当前text内容相当的尺寸。
(3)parent container view会与其subviews的frames相适应。8.Editor-&Embed In View,UnEmbed你是不是对此素手无策呢:你希望将已有的一些subviews放入到不同的parent view中,甚至是不同的.xib文件中,但是当你把一些view重新设置之后,它们为自动的位于新的parent view中心?如图所示,你怎么把1-12个数字label保持原有的样子放入到scrollView中呢?
Center.jpg (189.48 KB, 下载次数: 0)
23:31 上传
点击选中12个label,再选择editor中的embed in view:
Center.jpg (180.64 KB, 下载次数: 0)
23:31 上传
把view拖到scrollview中去,再次点击scrollView的unembed:
Center.jpg (179.06 KB, 下载次数: 0)
23:31 上传
OK,大功告成,很Esay是不,赶紧尝试吧。9.对不在最上面的视图进行位置移动。一般做法就是先将非最上面的view临时设置到最上面,移动好位置之后,在设置回去。费时费力不讨好。
最简单的方法:在document outline上双击view,就可以用箭头移动view了。
10.编辑出界的scrollView、tableview内容。当scrollView、tableview中控件超出了它们的frame,怎么编辑控件呢?
点击控件,然后滑动滑轮,直到把目标控件给滑动出来。
Center.jpg (57.46 KB, 下载次数: 0)
23:31 上传
二、Autolayout上的小技巧:
1.ScrollView上添加约束。
很多人都会遇到这种报错:
Center.jpg (95.65 KB, 下载次数: 0)
23:31 上传
这是因为ScrollView的ContentSize没有确定。
contentSize在布局中实际上是scroll view的子view :content view的宽和高实现的。往往对于scrollview中的子view,我 们同样也可以将其放在同一个父的container view中,然后将这个container view作为scrollview的子view也即content view,这样我们对scroll view 的布局就可以简化为对content view的布局,而content view里面的子view相对于content view的布局就是普通的布局了,剩下的只需要我们解决好scroll view和content view的布局即可。
Center.jpg (388.43 KB, 下载次数: 0)
23:31 上传
这时有个奇怪的现象:
ContentView上下距离约束怎么不与其高度约束冲突呢?
原来content view和scroll view的top, bottom, leading和trailing contstraints,这四个约束的使用在scroll view中做了变化:它不再是确定content view尺寸的依据,而是帮助scroll view中content view四周的边界(or你可以理解为留白),进而确定scroll view的contentSize属性。
2.UILabel添加约束
Label只需要添加top, leading约束即可,宽度会根据文字内容多少自动适应。
假若把Label的height再次固定,则高度会自动适应。
比如:银行名称与尾号左对齐,并且尾号一直在名称的底部。这里切记勾选上label的preferred width 。不然iOS8.0以下程序会crash掉。
Center.jpg (33.11 KB, 下载次数: 0)
23:31 上传
Center.jpg (488.33 KB, 下载次数: 0)
23:31 上传
3.TableViewCell高度自适应
(1)设置好布局约束条件,使得cell子视图的边缘固定(pin)到cell的contentView的边缘(最重要的是要有顶部和底部的边距约束条件),这样cell就能确定自己的高度了。
Center.jpg (108.44 KB, 下载次数: 0)
23:31 上传
(2)高度代理协议heightForRowAtIndexPath:千万别实现它。
tableview.rowheight=UITableviewAutomaticD
tableview.estimatedRowheight=44;
(3)设置好正确的preferredMaxLayoutWidth&&
[super layoutSubViews];
_contentLbl.preferredMaxLayoutWidth=_contentLbl.frame.size.
[super layoutSubViews];
Center.jpg (102.8 KB, 下载次数: 0)
23:31 上传
把滑动视图的高度减小,_bgScrollViewHeightLayout定义在这里:
@property (weak,nonatomic) IBOutLet NSLayoutConstraint *bgScrollViewHeightL
[_bgScrollView layoutIfNeeded];
_bgScrollViewHeightLayout.constant=kScreenHeight-64-
[UIView animateWithDuration:duration animations:^{
[_bgScrollView layoutIfNeeded];
5、约束调试:我们在iOS中遇到不可满足的约束条件,我们只能在输出的日志中看到视图的内存地址。尤其是在更复杂的布局中,有时很难辨别出视图的哪一部分出了问题。然而,在这种情况下,还有几种方法可以帮到我们。
首先,当你在不可满足的约束条件错误信息中看到NSLayoutResizingMaskConstraints时,你肯定忘了为你某一个视图设定translatesAutoResizingMaskIntoConstraints为NO。Interface Builder中会自动设置,但是使用代码时,你需要为所有的视图手动设置。
如果不是很明确那个视图计算问题,你需要通过内存地址来辨认视图。最简单的方法是使用调试控制台。你可以打印视图本身或它父视图的描述,甚至递归描述的树视图。这通常会提示你需要处理哪个视图。
(1)使用po 命令
Center.jpg (441.55 KB, 下载次数: 0)
23:31 上传
(2)一个更直观的方法是在控制台修改有问题的视图,这样你可以在屏幕上标注出来。比如,你可以改变它的背景颜色:
&span style=&font-size:12&&(lldb) expr ((UIView *)0x7731880).backgroundColor = [UIColor purpleColor] &/span&&&
确保重新执行程序后改变不会在屏幕上显示出来。还要注意将内存地址转换为(UIView *),以及额外的圆括号,这样我们就可以使用点操作。另外,你当然也可以通过发送消息:
&span style=&font-size:12&&(lldb) expr [(UIView *)0x7731880 setBackgroundColor:[UIColor purpleColor]] &/span&&&
(3)另一种方法是使用Instrument的allocation模板,根据分析。一旦你从错误消息中得到内存地址(运行Instruments时,你从控制台中获得的错误消息),你可以将Instrument切换到Objects List的详细视图,并且用Cmd-F搜索那个内存地址。这将会为你显示分配视图对象的方法,这通常是一个很好的暗示(至少找到创建视图对象的代码了)。
(4)你也可以在iOS中弄懂不可满足的约束条件错误,这比改善错误消息来的更简单。我们可以在一个category中重写NSLayoutConstraint的描述,并且将视图的tags包含进去:&span style=&font-size:12&&@implementation NSLayoutConstraint (AutoLayoutDebugging)
#ifdef DEBUG
- (NSString *)description
& & NSString *description = super.
& & NSString *asciiArtDescription = self.asciiArtD
& & return [description stringByAppendingFormat:@& %@ (%@, %@)&, asciiArtDescription, [self.firstItem tag], [self.secondItem tag]];
@end &/span&复制代码如果是整数的属性信息是不够的,我们还可以得到更多新奇的东西,为视图类增加我们自己命名的属性,然后可以打印到错误消息中。我们甚至可以在Interface Builder中,使用identity inspector中的 “User Defined Runtime Attributes”为自定义属性分配值。&span style=&font-size:12&&@interface UIView (AutoLayoutDebugging)
- (void)setAbc_NameTag:(NSString *)nameT
- (NSString *)abc_nameT
&&
@implementation UIView (AutoLayoutDebugging)
- (void)setAbc_NameTag:(NSString *)nameTag
& & objc_setAssociatedObject(self, &abc_nameTag&, nameTag, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
&&
- (NSString *)abc_nameTag
& & return objc_getAssociatedObject(self, &abc_nameTag&);
}
@implementation NSLayoutConstraint (AutoLayoutDebugging)
#ifdef DEBUG
- (NSString *)description
& & & & & & & & NSString *description = super.
& & NSString *asciiArtDescription = self.asciiArtD
& & return [description stringByAppendingFormat:@& %@ (%@, %@)&, asciiArtDescription, [self.firstItem abc_nameTag], [self.secondItem abc_nameTag]];
@end &/span&复制代码
通过这种方法错误消息变得更可读,并且你不需要找出内存地址对应的视图。然而,对你而言,你需要做一些额外的工作以确保每次为视图分配的名字都是有意义。
新人报到,大家多多指教 &&&&
积分金钱广播
高级会员, 积分 982, 距离下一级还需 18 积分
高级会员, 积分 982, 距离下一级还需 18 积分
有空一起交流一下
积分金钱广播
高级会员, 积分 991, 距离下一级还需 9 积分
高级会员, 积分 991, 距离下一级还需 9 积分
积分金钱广播
高级会员, 积分 988, 距离下一级还需 12 积分
高级会员, 积分 988, 距离下一级还需 12 积分
积分金钱广播
金牌会员, 积分 1992, 距离下一级还需 1008 积分
金牌会员, 积分 1992, 距离下一级还需 1008 积分
LZ敢整点更有创意的不?兄弟们等着围观捏~
积分金钱广播
金牌会员, 积分 2106, 距离下一级还需 894 积分
金牌会员, 积分 2106, 距离下一级还需 894 积分
高手云集 果断围观
积分金钱广播
金牌会员, 积分 2183, 距离下一级还需 817 积分
金牌会员, 积分 2183, 距离下一级还需 817 积分
纯粹路过,没任何兴趣,仅仅是看在老用户份上回复一下
积分金钱广播
金牌会员, 积分 2018, 距离下一级还需 982 积分
金牌会员, 积分 2018, 距离下一级还需 982 积分
积分金钱广播
金牌会员, 积分 2034, 距离下一级还需 966 积分
金牌会员, 积分 2034, 距离下一级还需 966 积分
积分金钱广播
金牌会员, 积分 2142, 距离下一级还需 858 积分
金牌会员, 积分 2142, 距离下一级还需 858 积分
前排支持下了哦~
注册账号后积极发帖的会员
社区QQ达人
使用QQ帐号登录论坛的用户
经常参与各类话题的讨论,发帖内容较有主见
经常帮助其他会员答疑
积极宣传本站,为本站带来更多注册会员
Powered by}

我要回帖

更多关于 autolayout 位移动画 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信