iosui设计规范怎么模拟碰撞

IOS UIDynamic仿物理引擎-浮动碰撞效果 - 简书
IOS UIDynamic仿物理引擎-浮动碰撞效果
最近产品提了个需求(电商的APP-两鲜),需要在APP背景加上几个水果图案在那里无规则缓慢游荡。。。模仿 天天果园 APP的。好吧,那我就在网上找了很多文章,总结一下写个demo。效果如下:
这里用到的是UIDynamic这个类。
UIDynamic简介
UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象如:重力、弹性碰撞等现象
广泛用于游戏开发,经典成功案例是“愤怒的小鸟”让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏。
注意:UIKit动力学的引入,并不是为了替代CA或者UIView动画,在绝大多数情况下CA或者UIView动画仍然是最有方案,只有在需要引入逼真的交互设计的时候,才需要使用UIKit动力学它是作为现有交互设计和实现的一种补充。
UIDynamic中的三个重要概念
Dynamic Animator:动画者,为动力学元素提供物理学相关的能力及动画,同时为这些元素提供相关的上下文,是动力学元素与底层iOS物理引擎之间的中介,将Behavior对象添加到Animator即可实现动力仿真。
Dynamic Animator Item:动力学元素,是任何遵守了UIDynamic协议的对象,从iOS7开始,UIView和UICollectionViewLayoutAttributes默认实现协议,如果自定义对象实现了该协议,即可通过Dynamic Animator实现物理仿真。
UIDynamicBehavior:仿真行为,是动力学行为的父类,基本的动力学行为类UIGravityBehavior、UICollisionBehavior、UIAttachmentBehavior、UISnapBehavior、UIPushbehavior以及UIDynamicItemBehavior均继承自该父类。
物理仿真行为
UIGravityBehavior:重力行为
UICollisionBehavior:碰撞行为
UISnapBehavior:捕捉行为
UIPushBehavior:推动行为
UIAttachmentBehavior:附着行为
UIDynamicItemBehavior:动力元素行为(可以设置动画元素的属性,比如摩擦力,密度,弹性等等)
因为项目需求在这里就不写重力行为,只需要推动行为和碰撞行为
NSMutableArray *array
=[NSMutableArray array];
for (int i = 0; i&5; i++) {
srand((unsigned int)time(NULL));
UIView *vienw = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
vienw.backgroundColor = [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1];
[self.view addSubview:vienw];
[array addObject:vienw];
给每个物理元素(vienw)添加一个不同角度的推力
UIPushBehavior *gravityBehavior = [[UIPushBehavior alloc]initWithItems:@[vienw] mode:UIPushBehaviorModeInstantaneous];
//创建一个推力
//[gravityBehavior addItem:vienw];
gravityBehavior.angle = i *0.15;
//设置推力的角度
gravityBehavior.magnitude = 0.1; //加速度,越大力越大
gravityBehavior.active = YES;
//激活力的作用
[self.animater
addBehavior:gravityBehavior];//加入仿真器
UIDynamicItemBehavior * itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:array];
//将所有物理元素添加动力元素行为
itemBehavior.elasticity = 1;
//设置弹性越大弹的越猛(笔者试了几次,发现1是原来的力气反弹,比1大会弹回去加力,比1小会衰减)
itemBehavior.friction = 0;
itemBehavior.density = 0.1;
//密度,,密度*体积等于质量 物理元素越大密度越大,越难推动
itemBehavior.resistance = 0;
// 抗阻力 0~CGFLOAT_MAX ,阻碍原有所加注的行为(如本来是重力自由落体行为,则阻碍其下落,阻碍程度根据其值来决定)
itemBehavior.allowsRotation = NO;是否允许旋转
[self.animater addBehavior:itemBehavior];
添加碰撞行为
UICollisionBehavior *cont = [[UICollisionBehavior alloc]initWithItems:array];
cont.collisionDelegate =//(如果需要截获碰撞发生时的事件的话可以使用)
cont.collisionMode = UICollisionBehaviorModeE
//枚举:碰撞所有物体(包括边界 和 物理元素:该物理元素必须是该行为的元素数组,如果给每一个vienw实例化一个碰撞行为的话,他们之间是不会发生碰撞的)
cont.translatesReferenceBoundsIntoBoundary = YES;
//是否设置参照物为边界
//[cont setTranslatesReferenceBoundsIntoBoundaryWithInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
//设置参照物为边界 ,并限制了边界范围;
// [cont addBoundaryWithIdentifier:@"conditon1" fromPoint:CGPointMake(0, 0) toPoint:CGPointMake(self.view.frame.size.width, self.view.frame.size.height)];设置两个点之间的连线为边界
[self.animater addBehavior:cont];
- (UIDynamicAnimator*)animater{
if (!_animater) {
//仿真器实例化
_animater = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
//参考视图
更多精彩请参考
/p/e096d2dda478
IOS 小书童。。。。QQ:
为那些无私奉献的IT牛人们献上最高的敬意!IOS开发 摇晃事件 - 简书
IOS开发 摇晃事件
iOS开发之摇晃事件
iso开发实现摇晃事件
摇晃事件相对简单,视图出现时成为第一响应者,视图移除时取消第一响应者,当称为第一响应者时,添加摇晃事件监听。摇晃事件监听的方法:
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event NS_AVAILABLE_IOS(3_0);
//UIEventSubtype 对应的枚举的值,
//UIEventSubtypeMotionShake= 1,此枚举值即为摇晃事件。
typedef NS_ENUM(NSInteger, UIEventSubtype) {
// available in iPhone OS 3.0
UIEventSubtypeNone
// for UIEventTypeMotion, available in iPhone OS 3.0
UIEventSubtypeMotionShake
// for UIEventTypeRemoteControl, available in iOS 4.0
UIEventSubtypeRemoteControlPlay
UIEventSubtypeRemoteControlPause
UIEventSubtypeRemoteControlStop
UIEventSubtypeRemoteControlTogglePlayPause
UIEventSubtypeRemoteControlNextTrack
UIEventSubtypeRemoteControlPreviousTrack
UIEventSubtypeRemoteControlBeginSeekingBackward = 106,
UIEventSubtypeRemoteControlEndSeekingBackward
UIEventSubtypeRemoteControlBeginSeekingForward
UIEventSubtypeRemoteControlEndSeekingForward
创建单视图应用:
新建一个UIVew(shakeView),让ViewController的根视图为新建的UIVew
shakeView添加: canBecomeFirstResponder方法,使其成为第一响应者。
详细实现代码:
1.在视图出现在屏幕时,让视图变成第一响应者
2.当视图离开屏幕时,应用关闭或者切换到其他视图时,注销第一响应者身份
3.监听摇晃事件
- (void)viewDidAppear:(BOOL)animated
[self.view becomeFirstResponder];
- (void)viewDidDisappear:(BOOL)animated
[self.view resignFirstResponder];
#pragma mark - 监听运动事件
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
if (UIEventSubtypeMotionShake ==motion) {
NSLog(@"The view is shake.");
在模拟器中 摇晃是在:Handware-&shake Gesture.
一个正走在ios开发路上的php程序员...在IOS中,UINavigationController在添加(push)与删除(pop)View的时候,会加入Slide的动画。有时候,在需要自己进行模拟这个动画的时候,会比较麻烦。
通常,可以使用CATransition来使用Push效果,基本代码如下:
CATransition *transition = [CATransition animation];
transition.duration = 0.3f;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionP
transition.subtype = kCATransitionFromR
transition.fillMode = kCAFillModeB
transition.speed = 0.5
transition.removedOnCompletion = YES;
[self.view.layer removeAllAnimations];
[self.view.layer addAnimation:transition forKey:nil];
上面是Push的代码,Pop的时候,只要将 subtype改为 kCATransitionFromLeft。
但是,使用CATransition的Push的时候,ios会将旧的view在推进中,进行Fade的处理。由于有这样的一个过程,会造成屏幕的闪白,而且与原来的UINavigationController的动画不一致。
要解决这个问题,只有使用暴力的方法,这个方法就是,先将原来的View进行截屏,生成一个UIImageView,再将这个UIImageView与新的View进行横向的平移动画,在动画结束之后,再将新的UIImageView进行删除。
截屏的代码:
UIGraphicsBeginImageContext(viewController.view.bounds.size);
CALayer *layer = viewController.view.layer;
[layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage&*image =&UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image& ;&
再使用UIView的animation来实现,
[UIViewbeginAnimations:nilcontext:nil];
[UIViewsetAnimationDuration:0.35f];
[UIViewsetAnimationDelegate:self];
[UIViewsetAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
[UIViewsetAnimationCurve:UIViewAnimationCurveEaseInOut];
imageView.origin = CGPointMake(imageView.origin.x-screenRect.size.width, imageView.origin.y) ;&
maskImageView.origin = CGPointMake(maskImageView.origin.x-screenRect.size.width, maskImageView.origin.y);
[UIViewcommitAnimations];
这个方法的缺点就是太过于暴力,在截屏的时候,会造成性能问题。
阅读(...) 评论()从零开始:你的第一个iOS App
招聘信息:
这次分享,我会给出写一个简单的 App 的每一个步骤,每一步都会有一张截图以及对应的文字说明,希望大家能在电脑上跟着每一步进行操作,最后都能完成这个 App。每个步骤我会给一个序号,如果你有哪一步不明白的,大家可以根据每个序号来进行提问。& && & &第一步&打开 Xcode ,点击红色框的部分,创建一个新工程。你也可以点击菜单里里的 File -> New -> Project,效果是一样的。&&第二步&选择 1 iOS下的 Application,然后选择 2 Single View Application,然后点击 Next。&&第三步&这里我们讲一下每个部分都是什么意思。Product Name&这里填入你的 App 的名字,建议使用英文字母,最好不要有空格和特殊字符。Organization Name&这里填入你的组织/公司的名字,比如 Google 公司就直接填 Google,当然你也可以随便填一个。Organization Identifier&这里是你的组织/公司的唯一标识,这部分和 Product Name 会混合成你的产品的唯一标识,这个标识在整个 iOS 的 App Store是唯一的,所以一般建议用你的域名的反向形式,比如 Google 公司的主域名是 , 那么在这里就反过来填 com.google,如果你没有域名也可以编一个,比如我这里填的就是自己的名字,这一般也能保证不重复。Language&注意,我们这里选了 Swift,默认是 Objective-C。Device&我们选择只针对 iPhone 的,另外还有选项是 iPad 和 Universal(iPhone 和 iPad 都兼容)。Use Core Data, Include Unit Tests, Include UI Tests&我们暂时用不到,全都不选中。填完之后,点击 Next,我们进入下一步&&第四步&选择你的保存路径后,一个工程就建立成功了。默认会选中 Main.storyboard 这个文件,storyboard 主要是用于写 iOS 的 UI 布局的,红色框起的部分是 Xcode 的编辑器部分,我们可以在左边的文件列表里选择文件,如果选中 swift 后缀的文件,会进入大家都很熟悉的代码编辑界面。由于我们现在选中的是 storyboard,所以进入了一个可视化的编辑界面。这是个所见即所得的编辑器,最后在手机屏幕上的 UI 基本就是这个编辑器里的样子。大家的这个界面可能比截图里的大,这里分别点击 1 2,然后在 3 所在的下拉框里选择 iPhone 4.7-inch,这个部分主要是改变设计期间的外观的,不影响实际运行的结果,最终的大小取决于你所运行的设备屏幕大小。&&第五步&这次我们添加一个 button 到屏幕中去,首先选中 1 这里是所有 UI 组件的列表,然后再 2 的位置输入 button,在列表中找到 3 Button 这个条目,然后用鼠标左键点中把这个条目拖到屏幕中去。注意屏幕中的 Button 边缘,这八个点可以拖动来缩放 Button,基本上所有的 UI 组件都可以这样操作。添加完后,我们注意一下 4 的位置,这里多了一个 Button 条目,这个 Button 就是我们刚才拖进去的那个 Button,可以看到它是作为 View 的一个子项,这里简单讲下,View 是 iOS 里最基本的 UI 组件,所有像 Button,Label 这些最终都是继承自 View,而每一张页面,一般都有一个最顶层的屏幕大小的 View,我们添加的所有 UI 组件最终都会作为它的子项。&&第六步&按图中顺序分别点击 1 2,在 3 的输入框中把内容修改为 Greeting (或者任何你喜欢的文字),敲回车确定。这时候 Button 的内容就变成了你输入的部分。红色框的部分就是用于修改选中的 UI 组件的各种属性的,大家有兴趣可以修改下 Text Color 看看效果。&&第七步&这一步我们要把 storyboard 中的设计界面与实际的代码关联起来了,首先我们看一下红框的位置,最顶层的 View Controller Scene,这个表示的是一个 iOS 页面的所有组成部分,里边一般都有一个顶层元素 View Controller,这个 View Controller 可以理解为它所包含的那个定层 View 的控制部分,而这个 View Controller 正好和我们的 ViewController.swift 中的 ViewController 类是相关联的。接下来我们进入编辑器的辅助模式,点击图中 1 的图标,然后选中红框中的 View Controller,这时候右侧应该会打开 ViewController.swift,如果没有打开,选中 2,在 Automatic 下找到 ViewController.swift。&&第八步&我们为点击页面中的 Button 添加一个响应事件,右键点击 1 所示的 Button 所在的位置,再弹出来的菜单里鼠标左键按下选中 Touch Up Inside 后边的小圆圈,然后拖动到 3 的位置(注意这个位置要在最后一个大括号前边,也就是类的作用域里),松开鼠标。解释一下,这个右键弹出的菜单,里边 Touch 开头的就是指这个 UI 组件被用户进行对应操作将会响应的事件,这个事件可以和我们的代码关联起来。&&第九步&继续前边,松开鼠标会弹出如图所示的对话框,在 1 的位置输入你喜欢的名字,这个将会作为事件响应的函数名,在这里我们用 showAlert,之后点击 2 Connect,就会在 ViewController 类里生成一个叫 showAlert 的类方法。&&第十步&回到标准编辑器界面(点击 1),选择 ViewController.swift(点击 2),在 showAlert 中添加如下代码。let alert = UIAlertController(title: "Greeting", message: "Hello World", preferredStyle: .Alert)let action = UIAlertAction(title: "Ok", style: .Default, handler: nil)alert.addAction(action)presentViewController(alert, animated: true, completion: nil)&第一行,我们创建了一个 UIAlertController 的对象,UIAlertController 就是一个类似对话框的东西第二行,第三行,创建了一个 UIAlertAction 的对象,并把这个对添加到了刚才创建的 UIAlertController,UIAlertAction 表示了对话框上一个个按钮最后,我们调用 presentViewController 把这个对话框显示出来。添加完代码后,我们把 3 的地方换成 iPhone 6s 模拟器,然后点击 4 运行。& &&第十一步&如果一切正确的话,Xcode 会启动一个 iPhone 的模拟器,然后显示如左图,点击 Greeting 会变为右图。至此,我们就完成了一个最简单的 Hello World 的 App。接下来,我们把这个 Hello World App 改造成一个简单的猜数字的游戏,每局游戏开始会随机生成一个 0-99 的数字,然后你输入一个你猜测的数字,系统会提示你猜大了还是猜小了,最后猜中,会显示出你一共猜了多少次才猜中的。&&第十二步&我们选中 Main.storyboard,在页面中添加一个新的 Button,并把它的内容改为 开始新的一局 ,然后在 1 的位置输入 Text,在 2 的位置找到 Text Field,然后把它拖到 3 的位置。Text Field 是一个负责接收用户输入的 UI 组件。同时我们把 Greeting 的内容修改为 提交 ,让这个 Button 用来提交我们的答案。&&第十三步 和之前生成 Button 的点击事件一样的步骤,为 开始新的一局 这个 Button 添加点击事件的响应函数,选择 1 进入编辑器的辅助模式,右键点击 2,拖动 3 到 4 的位置。& & & && & & &第十四步&和之前类似,在弹出的对话框中输入 startNewGame,这样会 ViewController 类中生成一个叫 startNewGame 的方法。&&第十五步&这一次我们为 Text Fileld 在 ViewController 生成一个对应的成员变量。这次的做法和之前的添加 Button 的响应事件有点不同,选中 1 的 Text Field,然后按住 Ctrl 键不放,同时鼠标左键按住拖动到 2 的位置,松开鼠标和键盘,注意,和之前一样,要拖动到类的作用域里,不要不小心拖到方法的作用域中去。& &第十六步&在弹出的对话框中 1 的输入框中填入成员变量的名字,这里我们给它取名 guessNumTextField。然后大家就可以回到标准编辑器的界面了。后边都是敲代码的部分了&。var number = Int(arc4random_uniform(100))var times = 0&& &第十七步&接下来我们再刚才生成的 guessNumTextField 下边再添加两个成员变量 number(这个变量的目的是保存每一局生成的数字),times(这个变量保存已经猜过的次数)。简单解释一下 var times = 0,由于我们给 times 赋值 0,Swift 的自动类型推导功能会自动推导出 times 的类型为 Int,所以我们不需要给 times 标注类型了。然后在这里我们声明变量用了 var,而不是之前的 let,两者的区别在于可变性,使用 var 声明的变量,以后还可以再给它赋值,而使用 let 声明的变量只能赋值一次。最后我们给 number 赋值里的 arc4random_uniform(100) 是用于生成一个随机数,参数 100 的意思是在 0-99 中生成一个。& & &第十八步&我们在 starNewGame 方法中把 times 初始化为 0,同时生成一个新的待猜数字。times = 0number = Int(arc4random_uniform(100))&et&resultText&=&guessNumTextField.text!
&&&&&&if&let&result&=&Int(resultText)&{
&&&&&&&&&&times&+=&1
&&&&&&&&&&var&message&=&""
&&&&&&&&&&if&result&>&number&{
&&&&&&&&&&&&&&message&=&"你输入的数字(result)太大了"
&&&&&&&&&&}&else&if&result&<&number&{
&&&&&&&&&&&&&&message&=&"你输入的数字(result)太小了"
&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&message&=&"猜中了,结果就是(result),你一共猜了(times)次"
&&&&&&&&&&}
&&&&&&&&&&let&alert&=&UIAlertController(title:&nil,&message:&message,&preferredStyle:&.Alert)
&&&&&&&&&&let&action&=&UIAlertAction(title:&"确定",&style:&.Default,&handler:&nil)
&&&&&&&&&&alert.addAction(action)
&&&&&&&&&&presentViewController(alert,&animated:&true,&completion:&nil)
&&&&&&}&else&{
&&&&&&&&&&let&alert&=&UIAlertController(title:&nil,&message:&"请输入0-99中的任意一个数字",&preferredStyle:&.Alert)
&&&&&&&&&&let&action&=&UIAlertAction(title:&"确定",&style:&.Default,&handler:&nil)
&&&&&&&&&&alert.addAction(action)
&&&&&&&&&&presentViewController(alert,&animated:&true,&completion:&nil)
&&&&&&}第十九步&这是我们最长的一段代码,这里包含了猜数字游戏的所有逻辑代码。接下来我们分别解释一下1 的部分是从输入框中取出用户输入的内容,返回结果为 String 类型2 是 Swift 里一种独特的用法,在 if 中直接声明变量,Int(resultText) 复杂将 String 类型转换为 Int,如果转换失败的话,result 就会为空,此时 if 分支就会失败,转入 else 分支3 我们先看一下 else 分支,如果用户输入非数字类型,或者根本没有输入内容,我们就弹出对话框,提示出错4 将猜测次数加一5 根据猜测结果生成对话框中要显示的内容,分别提示用户猜小了,猜大了,或者是猜中了。注意特殊语法 (result) ,Swift 在字符串中可以插入任何变量或者表达式,只要把他们放在 (),程序就会对他们自动求值,然后转换成对应的字符串进行替换。6 将刚才生成的内容在对话框中显示出来& & & & &&第二十步&好了,我们的小游戏到此就开发完毕了,点击运行,应该会得到这个结果。大家可以玩几局看看。看你一般几次可以猜中。本文由董一凡在StuQ首发,更多进阶iOS学习可以了解iOS开发专项学习课程。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量4613点击量4418点击量4287点击量3892点击量3818点击量3800点击量3521点击量3507点击量3044
&2016 Chukong Technologies,Inc.
京公网安备89}

我要回帖

更多关于 eve世界碰撞怎么养 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信