现在的位置: 首页 > 综合 > 正文

基于重力感应让UITableView随手机倾斜度而上下自动滚动

2016年01月21日 ⁄ 综合 ⁄ 共 2525字 ⁄ 字号 评论关闭

良好的用户体验是一款软件成功的关键,这次采用重力感应来做一个根据用户手机倾斜度来控制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


抱歉!评论已关闭.