文档章节

iOS 7 新特性 - UIKit Dynamics

Herbert77
 Herbert77
发布于 2015/09/02 12:37
字数 588
阅读 52
收藏 0

UIKit Dynamics 是一个被融入到 UIKit 框架中的物理引擎。

最为核心的使用思想可以用下图来展现:

image

为了更好地描述他们的关系,我对各个对象进行了适当的比喻。

UIDynamicAnimator 实例好比动态效果的导演。在该实例进行初始化的过程中,它需要知道这个动态效果在哪儿被执行,也就行演员视图的父视图,随后我们会创建很多的行为(可以理解成是剧本),这些行为是为演员视图准备的,同时,也要求被导演知道。演员视图产生的行为会获取父视图的边界(bounds)。

总结如下:

导演 需要获取 剧本(behaviour) 和 场景(reference view); 剧本 需要获取 它对应的 演员 (View). 剧本 将会根据实际的场景,进行(参数)对应。

实例演示:

        //  在 -(void) viewDidLoad 方法中
        // 1. 创建演员视图并且添加到父视图上 - 一个箱子  

        - (void) viewDidLoad {
            [super viewDidLoad];

            UIView *box = [[UIView alloc] initWithFrame:CGRectMake(100, 20, 50, 50)];           box.backgroundColor = [UIColor blueColor];
            [self.view addSubView: box];

        }
        // self.view 就相当于这个效果的实施场景了~
        // 在 viewController.m 文件中声明私有变量

        @interface ViewController () {

            UIDynamicAnimator *animator;
            UIGravityBehavior *gravity;
        }
        @end

        // 在 -(void) viewDidLoad 方法中
        // 创建实例,并且进行关联 和 添加
        animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
        gravity =  [[UIGravityBehavior alloc] initWithItems:@[box]];

        // 添加
        [animator addBehavior: gravity];

        // 现在基本上实现了 box 的自由落体效果
        // 为了不让 box 落到窗口的外面,我们继续添加一个 行为-产生碰撞效果
        @interface ViewController () {
            .....
            .....
            UICollisionBehavior *collision;
        }
        @end 

        - (void) viewDidLoad {

            collision = [[UICollisionBehavior alloc] initWithItems:@[box]];

            // 以 self.view 的 bounds 最为 边界
            collision.translatesReferenceBoundsIntoBoundary = YES;

            [animator addBehavior: collision];

            // 此时, box 掉落至屏幕边界的时候,就会回弹,直至静止下来

            // 之后,在碰撞行为上新增一个边界
            [collision addBoundaryWithIdentifier:@"barrier" fromPoint:CGPointMake( 0 , 400) toPoint:CGPointMake( 320, 400)];

        }

        // 想在 演员视图进行碰撞动作时,获取通知,则遵从 代理即可

        @interface ViewController () <UICollisionBehaviorDelegate> {
        }

        - (void) viewDidLoad {
            collision.delegate = self;
        }

        #pragma mark
        #pragma mark - UICollisionBehaviorDelegate 
        - (void) collisionBehavior:(UICollisionBehavior *)behavior beganContactForItem:(id<UIDynamicItem>)item withBoundaryIdentifier:(id<NSCopying>)identifier atPoint:(CGPoint)p {
            // 演员视图每次发生碰撞动作时,输出
            NSLog(@" Collision occurred!");
        }
        // 配置 导演视图的动作属性 让其具有更大的弹性
        // viewDidLoad() 中
        UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[box]];
        itemBehavior.elasticity = 0.7;
        [animator addBehavior: itemBehavior];

                                                                                                                                                                                

                                                                                                                                                                                Nov 6, 2014


© 著作权归作者所有

Herbert77
粉丝 0
博文 13
码字总数 10309
作品 0
武汉
程序员
私信 提问
UIView Animations 学习笔记(一)简介及API说明

目录 UIView Animations 学习笔记(一)简介及API说明 UIView Animation 学习笔记 应用示例 一、简介 随着iOS7的发布,动画与运动效果变成了Apple和第三方开发者进行app设计的中心。iOS7介绍...

灰大羊
2015/08/01
227
0
UIView Animations 学习笔记(二)定制动画效果及切换效果

目录 UIView Animations 学习笔记(一)简介及API说明 UIView Animations 学习笔记(二)定制动画效果及切换效果 UIView Animation 学习笔记 应用示例 二、视图切换定制 2.1 基础说明 要创建...

灰大羊
2015/08/12
193
0
QMUI iOS UI 框架正式发布

QMUI iOS QMUI iOS 是一个致力于提高项目 iOS UI 开发效率的解决方案,其设计目是用于辅助快速搭建一个具备基本设计还原效果的 iOS 项目,同时利用自身提供的丰富控件及兼容处理,让开发者能...

kayo5994
2017/01/03
3.9K
2
NS_ASSUME_NONNULL_BEGIN && NS_ASSUME_NONNULL_END

1.NSASSUMENONNULLBEGIN && NSASSUMENONNULLEND 在中存在类型,也就是使用?和!声明的变量。但是OC里面没有这个特征,因为在XCODE6.3之后出现新的关键词定义用于OC转SWIFT时候可以区分到底是...

贝勒老爷
04/24
0
0
UI 开发效率解决方案 - QMUI iOS

QMUI iOS 是一个致力于提高项目 UI 开发效率的解决方案,其设计目的是用于辅助快速搭建一个具备基本设计还原效果的 iOS 项目,同时利用自身提供的丰富控件及兼容处理, 让开发者能专注于业务...

kayo5994
2016/12/29
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 如果是个帅小伙你愿意和他出去吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《Ghost 》游戏《死亡搁浅》原声 《Ghost 》游戏(《死亡搁浅》原声) - Au/Ra / Alan Walker 手机党少年们想听歌,请使劲儿戳...

小小编辑
今天
203
7
java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部