编辑: hgtbkwd | 2012-12-12 |
UIGravityBehavior* gravityBehavior = [[UIGravityBehavioralloc] ?initWithItems:@[frogImageView, dragonImageView]];
[gravityBehaviorsetXComponent:0.0f yComponent:1.0f];
UICollisionBehavior* collisionBehavior = [[UICollisionBehavioralloc] ?initWithItems:@[frogImageView, dragonImageView]];
[collisionBehaviorsetCollisionMode:UICollisionBehaviorModeBoundaries];
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
[animatoraddBehavior:gravityBehavior];
[animatoraddBehavior:collisionBehavior];
UICollisionBehavior 还提供了一个代理回调用于遵照 UICollisionBehaviorDelegate 协议. collisionBehavior.collisionDelegate = self;
UICollisionBehaviorDelegate 函数有
4 个回调方法,两个用于碰撞开始,另两个用于碰撞 结束.每一个回调集都有一个方法用来定义边界是否出现碰撞.所有方法都提供了对导致回 调方法触发的对象的引用.检测碰撞开始的方法还提供了一个 CGPoint 对象,用于记录碰撞 发生的确切位置.示例代码会在对象检测到碰撞时更新标签的显示. -(void)collisionBehavior:(UICollisionBehavior *)behavior ?beganContactForItem:(id)item ?withBoundaryIdentifier:(id)identifier atPoint:(CGPoint)p { if([item isEqual:frogImageView]) collisionOneLabel.text = @ Frog Collided ;
if([item isEqual:dragonImageView]) 精通 iOS 框架(第2版)
6 collisionTwoLabel.text = @ Dragon Collided ;
} -(void)collisionBehavior:(UICollisionBehavior *)behavior ?endedContactForItem:(id)item ?withBoundaryIdentifier:(id)identifier { NSLog(@ Collision did end );
} 1.3.3 附着效果 附着效果定义了两个对象间的动态连接,可实现两个移动对象间的绑定关系.默认情况 下,UIAttachmentBehaviors 都是固定在对象中心的,附着点可以通过程序自行设置为对象上 的任何一点. 本节示例程序的创建以上一节 碰撞效果 中的程序为基础.仍然使用两个图片视图, 边界碰撞已经创建好,并且已应用到 UIDynamicAnimator 对象上.创建一个新的 CGPoint 并 设置青蛙图片视图的中心点作为其关联点.创建一个新的 UIAttachmentBehavior 对象并使用 initWithItem:attachedToAnchor:对其进行初始化.这里仍然需要对 UICollisionBehavior 进行额 外的初始化,从而指定具体的点和其他对象的规范.将碰撞效果和附着效果都添加到动画 对象. animator = [[UIDynamicAnimatoralloc] initWithReferenceView:self.view];
UICollisionBehavior* collisionBehavior = [[UICollisionBehavioralloc] ?initWithItems:@[dragonImageView, frogImageView]];
[collisionBehaviorsetCollisionMode:UICollisionBehaviorModeBoundaries];
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
CGPointfrogCenter = CGPointMake(frogImageView.center.x, ?frogImageView.center.y);
self.attachmentBehavior = [[UIAttachmentBehavioralloc] ?initWithItem:dragonImageViewattachedToAnchor:frogCenter];
[animatoraddBehavior:collisionBehavior];
[animatoraddBehavior:self.attachmentBehavior];
这些对象现在已经被一个长度为其初始距离的可见连接线围住, 如果青蛙图片视图移动, 那么龙图片视图将会保持中心点不变而随之移动.不过现在青蛙图片还不具有移动的能力, 为解决这个问题,示例程序需要实现一个简单的平移手势.当青蛙图片视图在主视图中移动 时,中心点位置更新的同时会设置更新的锚点. 第1章UIKit Dynamics
7 -(IBAction)handleAttachmentGesture:(UIPanGestureRecognizer*)gesture { CGPointgesturePoint = [gesture locationInView:self.view];