OC开发_Storyboard——block和动画
一、协议
@optional :可选的
@requied :必须实现的
二、block 代码块
1、 以一个^开头,然后是参数,然后是一个大括号,包含我们的代码块
- [aDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
- NSLog(@“value for key %@ is %@”, key, value);
- if ([@“ENOUGH” isEqualToString:key]) {
- *stop = YES;
- }
- }];
2、如果在变量前面加上一个__block,那么这个变量就会从栈中移到堆中
- __block BOOL stoppedEarly = NO;
- double stopValue = 53.5;
- [aDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
- NSLog(@“value for key %@ is %@”, key, value);
- if ([@“ENOUGH” isEqualToString:key] || ([value doubleValue] == stopValue)) {
- *stop = YES;
- stoppedEarly = YES; // this is legal now
- }
- }];
- if (stoppedEarly) NSLog(@“I stopped logging dictionary values early!”);
3、存储循环:只要Block存在block中所有的对象,就都有一个强指针指向它们
如下:block有一个强指针指向self,同时,self也有一个强指针指向block(self.myBlock)
- [self.myBlocks addObject:^ {
- [self doSomething];
- }];
解决方法是:采用一个__weak类型,也就是弱类型,不会存储在堆中,没有指针指向的时候,为nil
- __weak MyClass *weakSelf = self; //self is strong , weakSelf is weak
- [self.myBlocks addObject:^ {
- [weakSelf doSomething];
- }];
4、应用:枚举、视图动画、排序、通知、错误处理、后台线程处理(多线程)
三、动画
1、三种方式:fame\transform\alpha
- + (void)animateWithDuration:(NSTimeInterval)duration
- delay:(NSTimeInterval)delay
- options:(UIViewAnimationOptions)options
- animations:(void (^)(void))animations
- completion:(void (^)(BOOL finished))completion;
例子:
- [UIView animateWithDuration:3.0 //代表持续多久
- delay:0.0 //等待多长时间开始执行
- options:UIViewAnimationOptionBeginFromCurrentState //拦截:这里的选项代表从当前状态,而不是又从头开始计算
- animations:^{ myView.alpha = 0.0; } //执行修改等
- completion:^(BOOL fin) { if (fin) [myView removeFromSuperview]; }]; //bool用来判断动画是否执行完成
2、IOS7 新增的
(1 新建一个UIDunamicAnimator
(2 添加动力行为:例如重力、碰撞、推动等
(3 添加内容UIdynamicItems (这些item必须实现协议)
- UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:aView];//新建一个UIDunamicAnimator
- UIGravityBehavior *gravity = [[UIGravityBehavior alloc] init];//添加行为
- [animator addBehavior:gravity];
- id <UIDynamicItem> item1 = ... ;//添加内容
- id <UIDynamicItem> item2 = ... ;
- [gravity addItem:item1];
[gravity addItem:item2];
如果animator正在移动但是同时要让它旋转,必须调用updateItmeUsingCurrentState方法,否则由于性能关系它会假设已知道当前的状态
3、具体的行为
(1 UIGravityBehavior //重力行为:默认方向是向下
- @property CGFloat angle //角度
- @property CGFloat magnitude //重力大小(为1的时候代表是重力加速度)
(2 UICollisionBehavior //碰撞行为
- @property UICollisionBehaviorMode collisionMode //动力项:例如是相互碰撞弹开或只是从边界碰撞弹开
- @property BOOL translatesReferenceBoundsIntoBoundary //是否为有弹性的边界
(3 UIAttachmentBehavior //吸附行为:通过它可以将一个动力项吸附到一个固定描点或另外一个动力项上
- //初始化不用allocation或者init,而是在初始化时指定吸附对象,比如与另一个动力项、描点或者倾斜的方式等
- @property CGFloat length //两个吸附项之间的距离
- @property CGPoint anchorPoint
(4 UISnapBehavior //速甩行为:使一个动力项飞速过去某个位置,到达后可能不会马上停止,或许会像弹簧一样晃动
- //初始化的时候也是通过指定飞向的point
- -(instancetype)initWithItme:(id <UIDynamicItme> item) snapToPoint:(CGPoint)point
(5 UIPushBehavior //推动行为
- @property UIPushBehaviorMode mode //持续的或者是瞬间的、猝发的
- @property CGVector pushDirection //推动的距离
- @property CGFloat magnitude/angle //角度或者推力大小
(6 UIDynamicItemBehavior //动力项行为类:对应上面所需要添加控制的一个类,可以通过它获取速度或者其他什么东东从而来改变现状
- //比如说:
- @property BOOL allowsRotation //旋转
- @property BOOL friction //摩擦力
- @property BOOL elasticity //弹力、有弹性
- @property CGFloat density //密度
//也可以通过以下方法知道你的行为是否在执行或者是由哪个动画执行
-(void)willMoveToAnimator(UIDynamicAnimator *)animator//当行为移动到动画中,或者被移开都会调用到
(7 UIDynamicItemBehavior的action属性:相当于block,只要指定了动力项行为,每次遇到这个行为都会去执行
四 、demo
这个demo比较复杂,杂糅了动画、手势,包括重力、吸附、碰撞、摩擦、曲线、禁止旋转等是一个综合性比较强的例子,可以先看看里面应用到的代码片段
1、拖曳的手势,要注意判断3个时机
2、点击手势,掉落,这里有三个要注意的,
第一个是随机产生很的一个方块View,随机数的产生是从(0到我们背景UIView的宽度之间的大小-1)
第二个是我们要将我们最后一个方块当作我们拖曳的时候的view[这在吸附里需要取控制它的]
第三个是我们要注意动画的加入content内容,从一开始创建一个UIDunamicAnimator,然后在添加动力行为[如碰撞重力等在一个我们封装的类里面实现],最后添加内容也就是这第三步
3、吸附行为,这里有三个要注意的点,block的使用要注意变量、循环强指针引用、吸附的当前描点是不断变化的
4、动画的委托遵循UIDynamicAnimatorDelegate协议
dynamicAnimatorDidPause和dynamicAnimatorWillResume分表实现动画结束和开始的时候要做的操作
(如果没有_animator.delegate = self;是无法执行到的)
5、这里注意的是我们封装了一个dropitBehavior类,这个类专门用来封装我们的行为,
诸如我们的重力(UIGravityBehavior)、碰撞(UICollisionBehavior)、动力项行为指向(摩擦密度之类的UIDynamicItemBehavior)
在这个类操作我们控制动画的第二步,就是将这个动力行为加入到我们的动画中
6、还有我们的曲线类 BezierPathView,在我们ViewController中操作我们的曲线类的时候,是以我们UiView作为背景的,所以需要设置view的customClass为“BezierPathView”,
具体是在我们的吸附方法中使用block构造曲线,随着吸附的过程构造一个拖动的曲线。
这里不一一介绍,看demo演示:
demo下载地址:http://pan.baidu.com/s/1o69kfuM
OC开发_Storyboard——block和动画的更多相关文章
- OC开发_Storyboard——MapKit
一.Core Location 1.基本对象 @propertys: coordinate, altitude, horizontal/verticalAccuracy, timestamp, sp ...
- OC开发_Storyboard——多线程、UIScrollView
一.多线程 1.主队列:处理多点触控和所有UI操作(不能阻塞.主要同步更新UI) dispatch_queue_t mainQueue = dispatchg_get_main_queue(); // ...
- OC开发_Storyboard——UITableView
一.tableView 1.datasource数据源 (1 构造每一个tableVIewCell的方法:cellForRowAtIndexPath,这里的 dequeueReusableCellWi ...
- OC开发_Storyboard——iPad开发
iPad开发(Universal Applications) 一.iPad 1.判断是否在iPad上 BOOL iPad = ([[UIDevice currentDevice] userInterf ...
- OC开发_Storyboard——Core Data
一 .NSManagedObjectContext 1.我们要想操作Core Data,首先需要一个NSManagedObjectContext2.那我们如何获得Context呢:创建一个UIMana ...
- OC开发_Storyboard——AutoLayout
一.autolayout 自动布局: 1. 设置所有视图框架的三种方法,可以通过代码创建也可以storyboard设置 = 规则 (1 蓝线+约束:(位置) 使用蓝线,根据蓝线拖动控件,只是告诉Xco ...
- OC开发_Storyboard——UIApplication和网络活动指示器
一.UIApplication 只有一个实例: UIApplication *myApplication = [UIApplication sharedApplication]; 属性如果设置为YES ...
- OC开发_Storyboard——绘制和视图
1.绘制 不要调用drawRect.调用setNeedsDisplay相当于告知系统视图需要重绘, 它会去调用drawRect,更新屏外缓冲器 2.UIBezierPath绘制图形, 设置图像op ...
- OC开发_Storyboard——NaviationController简单例子
一个简单的Navigation的例子,demo里面用到了上一个demo的MVC,可以参考下:http://www.cnblogs.com/daomul/p/4426063.html 建立一个Nav其实 ...
随机推荐
- zebra/quagga
参考:http://blog.chinaunix.net/uid-25513153-id-212328.html 一.zebra安装 .编译安装 vim ./lib/zebra.h + 增加: #if ...
- 第二百九十九节,python操作redis缓存-SortSet有序集合类型,可以理解为有序列表
python操作redis缓存-SortSet有序集合类型,可以理解为有序列表 有序集合,在集合的基础上,为每元素排序:元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值, ...
- SSH远程登录其他机器
常用格式:ssh [-l login_name] [-p port] [user@]hostname更详细的可以用ssh -h查看. 不指定用户: ssh 192.168.0.11 指定用户: ssh ...
- Apache 运行PHP原理
php,apache和mysql组合的工作过程: PHP的所有应用程序都是通过WEB服务器(如IIS或Apache)和PHP引擎程序解释执行完成的,工作过程: (1)当用户在浏览器地址中输入要访问的P ...
- php error_log错误信息写入文件
- Hibernate学习(1):查询demo
1.数据库(mysql)创建脚本 DROP TABLE IF EXISTS role; CREATE TABLE IF NOT EXISTS `role`( `id` ) NOT NULL AUTO_ ...
- 第三章 SqlSessionFactoryBean(MyBatis)
SqlSessionFactoryBean 在基本的 MyBatis 中,session 工厂可以使用 SqlSessionFactoryBuilder 来创建.而在 MyBatis-Spring 中 ...
- get 方法向后台提交中文乱码问题
前端js代码 function searchAll(){ var contentStr = $('#contentStr_id').val(); contentStr =encod ...
- mysqlbinlog工具的作用是什么呢,如何将binary log转换为文本格式?
需求描述: 今天在看mysqlbinlog这个工具,就在想这个工具到底是干嘛的呢,在mysql数据库中, binary log中记录了数据库内容的变化或者说修改,这些修改是以二进制的方式存储到 bin ...
- 实例:用类来写一个 memcached 启动脚本
[root@localhost ~]$ yum install -y memcached #!/usr/bin/env python #-*- coding:utf-8 -*- import os i ...