良好的用户体验是一款软件成功的关键,这次采用重力感应来做一个根据用户手机倾斜度来控制UITableView列表上下自动滚动的效果。
运行效果如下:
具体代码:
1,首先创建一个能感知当前设备X-Y-Z方向的类,具体技术可参考相关文档,这里只是代码展示
// AccelerManager.h
#import <Foundation/Foundation.h> #import <CoreMotion/CoreMotion.h> @protocol AccelerManagerDelegate - (void)updateWithX:(double)accelerometerX Y:(double)accelerometerY; @end @interface AccelerManager : NSObject @property (nonatomic, strong) CMMotionManager *mManager; @property (nonatomic, weak) id<AccelerManagerDelegate> delegate; - (void)startUpdateAccelerometer; - (void)stopUpdate; @end
// AccelerManager.m
#import "AccelerManager.h" @interface AccelerManager () @end @implementation AccelerManager -(id)init { if (self= [super init]) { _mManager = [[CMMotionManager alloc] init]; } return self; } -(CMMotionManager *)mManager { if (!_mManager) { _mManager = [[CMMotionManager alloc] init]; } return _mManager; } - (void)startUpdateAccelerometer { NSTimeInterval updateInterval = 0.1; __weak AccelerManager *tempAm = self; if ([self.mManager isAccelerometerAvailable] == YES) { [self.mManager setAccelerometerUpdateInterval:updateInterval]; [self.mManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { [tempAm.delegate updateWithX:accelerometerData.acceleration.x Y:accelerometerData.acceleration.y]; }]; } } - (void)stopUpdate { if ([self.mManager isAccelerometerActive]){ [self.mManager stopAccelerometerUpdates]; } } @end
以上就是控制位置变化的类,有个代理和协议的使用,大家可直接复制即可,当然了要引入相应的库文件
2,在列表类中使用,相关代码
先定义和初始化:
@property (nonatomic, strong) AccelerManager *accelerManager;//引入头文件,定义 //viewDidLoad初始化 _accelerManager = [[AccelerManager alloc] init]; _accelerManager.delegate = self; [_accelerManager startUpdateAccelerometer]; //直接开启感知
实现它的协议
#pragma mark- AccelerManagerDelegate -(void)updateWithX:(double)accelerometerX Y:(double)accelerometerY { // NSLog(@"X=%f\nY=%f",accelerometerX,accelerometerY); if (accelerometerY<-0.2 && accelerometerY> -0.8) { if (accelerometerY > -0.5) { // NSLog(@"上滑"); [self scrollListY:fabsf(accelerometerY)]; }else{ // NSLog(@"下滑"); [self scrollListY:accelerometerY]; } } } -(void)scrollListY:(float)Y { CGPoint point = self.tableView.contentOffset; if (point.y>= 0 && point.y <= self.tableView.contentSize.height-IPHONE_HEIGHT_NAI) { point.y += Y*20; [UIView animateWithDuration:0.1 animations:^{ [self.tableView setContentOffset:point animated:NO]; }]; } }
注意我们只是控制这个tableview的offset---Y的变化,并已 -0.5 为分隔带,大于则表示列表要上滑,反之亦然,如果超过-0.8 或 -0.2 则表示不会滑动,便于用户查看,这里注意响应时间间隔 0.1 ,这个和监听重力的时间 0.1相同,目的是让滚动更流畅些,至此就实现了一个列表随着手机的倾斜度而自动滚动的体验,具体实例项目可下载参考:IT面试宝典
-https://itunes.apple.com/cn/app/it-mian-shi-bao-dian-kai-fa/id866117100?l=en&mt=8
后语:
支持个人开发者,欢迎加入,让想象变成可能 微推 - www.micropush.cn