反弹小球和加速度传感器的使用(UIAccelerometer)
序言:
我们都见过人家做的小球运动,现在我们一起也做一个自己的小球运动。
今天的小球的效果是:程序运行后,将在画面中间,有一个小球,然后,你倾斜手机,小球将向着手机倾斜的方向飞移动,碰到四壁的时候将会反弹回来。
正文:
首先,我们要讲一下思路;
第一: 在UIViewController的子类里追加UIAccelerometerDelegate的协议,只有这样画面才能接收到速度的通知。接着我们创建小球的对象,和两个方向的加速度值;
代码如下:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController<UIAccelerometerDelegate>
{
//我们创建3个对象
UIImageView*_imageView;
//小球X方向的速度
UIAccelerationValue _speedX;
//小球Y方向的速度
UIAccelerationValue _speedY;
}
@end
-(void)viewDidLoad{
[super viewDidLoad];
[self makeUI];
}
-(void)makeUI
{
self.view.backgroundColor=[UIColor greenColor];
//追加球体
UIImage * image=[UIImage imageNamed:@"qiu.png"];
_imageView=[[UIImageView alloc]initWithImage:image];
_imageView.center=self.view.center;
//让小球自适应
_imageView.autoresizingMask=UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleTopMargin;
[self.view addSubview:_imageView];
}-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//开始获取加速度传感器传过来的值
UIAccelerometer*accelermeter=[UIAccelerometer sharedAccelerometer];
accelermeter.updateInterval=1.0/60.0;//《60HZ
accelermeter.delegate=self;
}
//处理从加速度传感器接收来的通知
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
//在X轴上附加X轴上的加速度
_speedX+=acceleration.x;
//在Y轴上附加Y轴上的加速度
_speedY+=acceleration.y;
CGFloat posX=_imageView.center.x+_speedX;
//根据速度调整球体位置的坐标
CGFloat posY=_imageView.center.y-_speedY;
//根据速度调整球体的做标
if (posX<.0) {
//碰到边框反弹的处理
posX=.0;
_speedX*=-0.4;//返回的加速度
}else if (posX>self.view.bounds.size.width)
{
posX=self.view.bounds.size.width;
_speedX=-.4;
}
if (posY<.0) {
posY=.0;
_speedY=.0;
}else if (posY>self.view.bounds.size.height)
{
posY=self.view.bounds.size.height;
_speedY*=-1.5;//碰到下边框1.5倍返回
}
_imageView.center=CGPointMake(posX, posY);
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
_speedX=_speedY=.0;
//结束从加速传感器取值
UIAccelerometer*accelerometer=[UIAccelerometer sharedAccelerometer];
accelerometer.delegate=nil;
}
完整代码:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController<UIAccelerometerDelegate>
{
//我们创建3个对象
UIImageView*_imageView;
//小球X方向的速度
UIAccelerationValue _speedX;
//小球Y方向的速度
UIAccelerationValue _speedY;
}
@end
#import "ViewController.h"
#import "Mylabel.h"
@implementation ViewController
-(void)viewDidLoad{
[super viewDidLoad];
[self makeUI];
}
-(void)makeUI
{
self.view.backgroundColor=[UIColor greenColor];
//追加球体
UIImage * image=[UIImage imageNamed:@"qiu.png"];
_imageView=[[UIImageView alloc]initWithImage:image];
_imageView.center=self.view.center;
//让小球自适应
_imageView.autoresizingMask=UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleTopMargin;
[self.view addSubview:_imageView];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//开始获取加速度传感器传过来的值
UIAccelerometer*accelermeter=[UIAccelerometer sharedAccelerometer];
accelermeter.updateInterval=1.0/60.0;//《60HZ
accelermeter.delegate=self;
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
_speedX=_speedY=.0;
//结束从加速传感器取值
UIAccelerometer*accelerometer=[UIAccelerometer sharedAccelerometer];
accelerometer.delegate=nil;
}
//处理从加速度传感器接收来的通知
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
//在X轴上附加X轴上的加速度
_speedX+=acceleration.x;
//在Y轴上附加Y轴上的加速度
_speedY+=acceleration.y;
CGFloat posX=_imageView.center.x+_speedX;
//根据速度调整球体位置的坐标
CGFloat posY=_imageView.center.y-_speedY;
//根据速度调整球体的做标
if (posX<.0) {
//碰到边框反弹的处理
posX=.0;
_speedX*=-0.4;//返回的加速度
}else if (posX>self.view.bounds.size.width)
{
posX=self.view.bounds.size.width;
_speedX=-.4;
}
if (posY<.0) {
posY=.0;
_speedY=.0;
}else if (posY>self.view.bounds.size.height)
{
posY=self.view.bounds.size.height;
_speedY*=-1.5;//碰到下边框1.5倍返回
}
_imageView.center=CGPointMake(posX, posY);
}
@end
| 方法名 |
调用时机 |
| -(BOOL)textViewShouldBeginEditing:(UITextView *)textView |
编辑开始前被调用。如果返回NO,编辑将不会开始。 |
|
-(BOOL)textViewShouldEndEditing:(UITextView *)textView
|
编辑结束前被调用,如果返回NO编辑不会结束。 |
|
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
|
改变文本前被调用,向range中设置变化范围,text中设置变化后的字符串。返回NO变化不会反应。 |
|
-(void)textViewDidBeginEditing:(UITextView *)textView
|
编辑开始前被调用。UITextView *变成第一相应着时被调用。 |
| -(void)textViewDidEndEditing:(UITextView *)textView |
编辑结束后,被调用,UITextView *失去第一相应着时被调用。 |
| -(void)textViewDidChange:(UITextView *)textView |
文本变更时被调用。结果是没输入一个字符都会被调用 |
| -(void)textViewDidChangeSelection:(UITextView *)textView |
游标移动,选着范围变化时调用 |
原文地址:http://blog.csdn.net/zhoushuangjian511/article/details/42235591