Day19
回顾:
1. UIView的内部布局
VC可以对直接子视图布局,但是不能对视图的内部直接布局,所以view必须就有自身 布局的能,通过重写UIView的LayoutSubView方法实现当需要布局的时候,方法执行的顺序
a.VC的viewWillLayoutSubView
b.View的layoutSubView
d.VC的ViewDidLayoutSubView
2. Autoresizing布局
利用等比变换的原则,保持视图与父视图的变换比率相同,使用简单,但是使用的效果有限,有时还需要结合手写代码结合实现布局。
3 AutoLayout自动布局
理念:使用“约束”描述位置,具体的坐标有系统根据约束计算出来
实现:
方法一:在storyboard中利用配置项
方法二:使用代码的方式创建约束
今天:
1.Auto Layout代码创建约束
step1:创建约束对象
NSLayoutConstraint(API )
step2:: 将约束添加到父视图中
方法一:使用万能公式:
+ (id)constraintWithItem:(id)view1
attribute:(NSLayoutAttribute)attr1
relatedBy:(NSLayoutRelation)relation
toItem:(id)view2
attribute:(NSLayoutAttribute)attr2
multiplier:(CGFloat)multiplier
constant:(CGFloat)c
万能公式:"view1.attr1 <relation> view2.attr2 * multiplier + constant".
如button.left=self.view.left*0+20;
button.right=self.view.width*1+(-20);
使用注意事项:translateAutoresizingToConstraints这个属性默认值是YES,这个属性代表将视图默认自带的Autoresizing特性是是否自动转换为对应的约束,既然使用代码来创建约束,那么就不要让系统自带的转换过来的约束影响添加的自定义约束,所以该属性要设置为NO 为了保证效果,可以将视图以及视图的父视图的该属性设置为NO即可。
创建约束对象以后 一定要加到父视图当中
方法二:一次性创建多个约束,使用VFL(Visual Format Language)
+ (NSArray *)constraintsWithVisualFormat:(NSString *)format? options:(NSLayoutFormatOptions)opts? metrics:(NSDictionary *)metrics? views:(NSDictionary *)views
metrics参数
用于指定VFL字符串中可以替换的值,是一个字典类型
如:NSDictionary *metrics = @{@"left":@20,@"space":@10,@"right":@20};
NSDictionaryOfVariableBinding()函数
NSDictionary *dictionary = NSDictionaryOfVariableBindings(b1,b2,b3);
生成的字典如下:
@{@"b1":b1,@"b2":b2,@"b3":b3}
特点:功能强大
1.4 如何写VFL字符串
| 代表倒父视图边界的距离
V: | 垂直方向的高度距离上边界
[]:代表子视图(控件)
():代表一个条件(== >= <=)==时可以省
—代表的是间距 默认值是8
—XXX—代表间距是多少
如: |-20-[button1]-10-[button2(button1)-10-[button3(button1)]-20-|
V:|-20-[button1]
2. 动画(Animation)
2.1 是什么?
“帧动画”:一帧是一张静态你的图片,一般情况下,一秒达到25帧的时候,人眼就分不清楚图片的切换过程了,就产生了连续的效果。
2.2 IOS中的动画
UIImage类:自带一些方法,可以做简单的动画
NSTimer类:间隔指定的时间,产生切换的效果
UIView类:本身提供的功能
底层的core Animation提供了支持动画的底层属性
在IOS7中增加了一些动画功能
UIKit Dynamic 动力
Motion Effects 特效
Sprite Kit(corde 2D引擎)
3. UIImage类动画:
//durantion 播放一组图片用的时间
UIImage *image = [UIImage animatedImageNamed:@"ship-anim" duration:1*5/30];
self.imageView.image = image;
4. NSTimer
方法一:定时器创建后就会自动启动
self.timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(doSomething:) userInfo:nil repeats:YES];
方法二:定时器创建之后,就需要代码启动
self.timer=[NSTimer timerWithTimeInterval:1 target:self selector:@selector(doSomething:) userInfo:nil repeats:YES];
//启动代码
[[NSRunLoop currentRunLoop]addTimer:self.timer forMode:NSDefaultRunLoopMode];
关闭定时器: [self.timer invalidate];
匀速运动
当前值=开始值+当前帧数*(结束值-开始值)/(帧率*动画时长)
这一个值可以是center transform frame alpha
变速运动:
公式:当前值=上一次的值+(目标值-上一次值)*渐进因子
5. UIView 动画:真正的动画有专门的API
5.1 是什么?
有UIKit专门制作的动画API 这些API的底层对Core Animation的封装 既可以实现动画,不应再计算每一帧来实现动画的效果
5.2 制作动画的步骤:
step1:设置需要动画视图的初始值
step2:给UIView类发消息 告诉UIView类需要什么样的动画
step3:将动画结束的状态写入到一个Bloack中
5.3 动画的高级选项:
先慢后快再慢
UIViewAnimationOptionCurveEaseInOut
越来越快
UIViewAnimationOptionCurveEaseIn
越来越慢
UIViewAnimationOptionCurveEaseOut
匀速
UIViewAnimationOptionCurveLinear
动画重复
UIViewAnimationOptionRepeat
反着执行动画,要配合Repeat选项
UIViewAnimationOptionAutoreverse