zoukankan      html  css  js  c++  java
  • IOS7笔记-8、协议、block、动画

    1、动画设置方法

      1)定义动画Animator

    1 @property (strong, nonatomic) UIDynamicAnimator *animator;
    2 
    3 -(UIDynamicAnimator *)animator
    4 {
    5     if (!_animator) {
    6         _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.gameView];
    7     }
    8     return _animator;
    9 }

      2)定义行为Behavior,并将行为添加到动画中

     1 @property (strong, nonatomic) UIGravityBehavior *gravity;//重力
     2 @property (strong, nonatomic) UICollisionBehavior *collider;//碰撞
     3 
     4 -(UIGravityBehavior *)gravity
     5 {
     6     if (!_gravity) {
     7         _gravity = [[UIGravityBehavior alloc] init];
     8         _gravity.magnitude = 0.9;
     9         [self.animator addBehavior:_gravity];
    10     }
    11     return _gravity;
    12 }
    13 
    14 -(UICollisionBehavior *)collider
    15 {
    16     if (!_collider) {
    17         _collider = [[UICollisionBehavior alloc] init];
    18         _collider.translatesReferenceBoundsIntoBoundary = YES;
    19         [self.animator addBehavior:_collider];
    20     }
    21     return _collider;
    22 }

      3)实现动画视图,并添加到相关的行为中

     1 -(void)drop
     2 {
     3     CGRect frame;
     4     frame.origin = CGPointZero;
     5     frame.size = DROP_SIZE;
     6     int x = (arc4random()%(int)self.gameView.bounds.size.width) / DROP_SIZE.width;
     7     frame.origin.x = x * DROP_SIZE.width;
     8     
     9     UIView *dropView = [[UIView alloc] initWithFrame:frame];
    10     dropView.backgroundColor = [self randomColor];
    11     [self.gameView addSubview:dropView];
    12     
    13     [self.gravity addItem:dropView];
    14     [self.collider addItem:dropView];
    15 }
    16 
    17 -(UIColor *)randomColor
    18 {
    19     switch (arc4random()%5) {
    20         case 0: return [UIColor greenColor];
    21         case 1: return [UIColor blueColor];
    22         case 2: return [UIColor orangeColor];
    23         case 3: return [UIColor redColor];
    24         case 4: return [UIColor purpleColor];
    25     }
    26     return [UIColor blackColor];
    27 }

      4)在其他地方,如手势事件中调用以上Drop方法

    1 - (IBAction)tap:(UITapGestureRecognizer *)sender {
    2     [self drop];
    3 }

     2、实现自定义动画行为类方法

      1)先创建一个UIDynamicBehavior子类DropitBehavior,并添加两个公共API方法AddItem和RemoveItem

    1 #import <UIKit/UIKit.h>
    2 
    3 @interface DropitBehavior : UIDynamicBehavior
    4 
    5 -(void)addItem:(id<UIDynamicItem>)item;
    6 -(void)removeItem:(id<UIDynamicItem>)item;
    7 
    8 @end

      2)定义两个行为或自定义行为

     1 @interface DropitBehavior()
     2 @property (strong, nonatomic) UIGravityBehavior *gravity;
     3 @property (strong, nonatomic) UICollisionBehavior *collider;
     4 @end
     5 
     6 -(UIGravityBehavior *)gravity
     7 {
     8     if (!_gravity) {
     9         _gravity = [[UIGravityBehavior alloc] init];
    10         _gravity.magnitude = 0.9;
    11     }
    12     return _gravity;
    13 }
    14 
    15 -(UICollisionBehavior *)collider
    16 {
    17     if (!_collider) {
    18         _collider = [[UICollisionBehavior alloc] init];
    19         _collider.translatesReferenceBoundsIntoBoundary = YES;
    20     }
    21     return _collider;
    22 }

      3)实现两个公共API方法,并实现初始化init将自定义行为做为子行为添加至当前类

     1 -(void)addItem:(id<UIDynamicItem>)item
     2 {
     3     [self.gravity addItem:item];
     4     [self.collider addItem:item];
     5 }
     6 
     7 -(void)removeItem:(id<UIDynamicItem>)item
     8 {
     9     [self.gravity removeItem:item];
    10     [self.collider removeItem:item];
    11 }
    12 
    13 -(instancetype)init
    14 {
    15     self = [super init];
    16     [self addChildBehavior:self.gravity];
    17     [self addChildBehavior:self.collider];
    18     return self;
    19 }

      4)在控制器中调用

     1 #import "DropitBehavior.h"//导入自定义类
     2 
     3 @property (strong, nonatomic) UIDynamicAnimator *animator;
     4 @property (strong, nonatomic) DropitBehavior *dropitBehavior;//声明
     5 
     6 -(UIDynamicAnimator *)animator
     7 {
     8     if (!_animator) {
     9         _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.gameView];
    10     }
    11     return _animator;
    12 }
    13 
    14 -(DropitBehavior *)dropitBehavior
    15 {
    16     if (!_dropitBehavior) {
    17         _dropitBehavior = [[DropitBehavior alloc] init];
    18         [self.animator addBehavior:_dropitBehavior];
    19     }
    20     return _dropitBehavior;
    21 }
    22 
    23 - (IBAction)tap:(UITapGestureRecognizer *)sender {
    24     [self drop];
    25 }
    26 
    27 -(void)drop
    28 {
    29     CGRect frame;
    30     frame.origin = CGPointZero;
    31     frame.size = DROP_SIZE;
    32     int x = (arc4random()%(int)self.gameView.bounds.size.width) / DROP_SIZE.width;
    33     frame.origin.x = x * DROP_SIZE.width;
    34     
    35     UIView *dropView = [[UIView alloc] initWithFrame:frame];
    36     dropView.backgroundColor = [self randomColor];
    37     [self.gameView addSubview:dropView];
    38     
    39     [self.dropitBehavior addItem:dropView];
    40 }
    41 
    42 -(UIColor *)randomColor
    43 {
    44     switch (arc4random()%5) {
    45         case 0: return [UIColor greenColor];
    46         case 1: return [UIColor blueColor];
    47         case 2: return [UIColor orangeColor];
    48         case 3: return [UIColor redColor];
    49         case 4: return [UIColor purpleColor];
    50     }
    51     return [UIColor blackColor];
    52 }

     3、动画委托中实现Did(Will)相关方法

      1)声明中定义委托

     1 @interface DropitViewController ()<UIDynamicAnimatorDelegate>
     2 @property (weak, nonatomic) IBOutlet UIView *gameView;
     3 @property (strong, nonatomic) UIDynamicAnimator *animator;
     4 @property (strong, nonatomic) UIGravityBehavior *gravity;
     5 @property (strong, nonatomic) UICollisionBehavior *collider;
     6 @property (strong, nonatomic) DropitBehavior *dropitBehavior;
     7 @end
     8 
     9 -(UIDynamicAnimator *)animator
    10 {
    11     if (!_animator) {
    12         _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.gameView];
    13         _animator.delegate = self;
    14     }
    15     return _animator;
    16 }

      2)实现相关委托方法

     1 //这是一个动画暂停发生后事件
     2 -(void)dynamicAnimatorDidPause:(UIDynamicAnimator *)animator
     3 {
     4     [self removeCompletedRows];
     5 }
     6 //遍历GameView视图将满足一行的全部Drop子视图搜索出来,并从中动画消除
     7 - (BOOL)removeCompletedRows
     8 {
     9     NSMutableArray *dropsToRemove = [[NSMutableArray alloc] init];
    10     
    11     for (CGFloat y = self.gameView.bounds.size.height-DROP_SIZE.height/2; y > 0; y -= DROP_SIZE.height)
    12     {
    13         BOOL rowIsComplete = YES;
    14         NSMutableArray *dropsFound = [[NSMutableArray alloc] init];
    15         for (CGFloat x = DROP_SIZE.width/2; x <= self.gameView.bounds.size.width-DROP_SIZE.width/2; x += DROP_SIZE.width)
    16         {
    17             UIView *hitView = [self.gameView hitTest:CGPointMake(x, y) withEvent:NULL];
    18             if ([hitView superview] == self.gameView) {
    19                 [dropsFound addObject:hitView];
    20             } else {
    21                 rowIsComplete = NO;
    22                 break;
    23             }
    24         }
    25         if (![dropsFound count]) break;
    26         if (rowIsComplete) [dropsToRemove addObjectsFromArray:dropsFound];
    27     }
    28     
    29     if ([dropsToRemove count]) {
    30         for (UIView *drop in dropsToRemove) {
    31             [self.dropitBehavior removeItem:drop];
    32         }
    33         [self animateRemovingDrops:dropsToRemove];
    34     }
    35     
    36     return NO;
    37 }
    38 //炸掉一行的动画效果
    39 -(void)animateRemovingDrops:(NSArray *)dropsToRemove
    40 {
    41     [UIView animateWithDuration:1.0
    42          animations:^{
    43              for (UIView *drop in dropsToRemove) {
    44                  int x = (arc4random()%(int)(self.gameView.bounds.size.width*5)) - (int)(self.gameView.bounds.size.width*2);
    45                  int y = self.gameView.bounds.size.height;
    46                  drop.center = CGPointMake(x, -y);
    47              }
    48          }
    49          completion:^(BOOL finished){
    50              [dropsToRemove makeObjectsPerformSelector:@selector(removeFromSuperview)];
    51          }];
    52 }
  • 相关阅读:
    【注册验证】 控制器(添加数据+后台验证)
    AJAX 简介
    我的博客生涯
    windows xp sp3 下载地址
    get、set、add、remove → (字段、属性)+(委托、事件)
    ArcObjects整体介绍
    委托
    对字符串的处理的又一个强大的工具,正则表达式
    对象序列化存在的原因
    关于文件操作的几个类
  • 原文地址:https://www.cnblogs.com/jonathan236/p/5572359.html
Copyright © 2011-2022 走看看