倾斜滚轮使用设备的内置加速计来控制在UIScrollView的内容周围移动。当用户调增设备时,材料会相应的下落,他不会把视图定位在屏幕上,而是把内容视图滚动到一个新的偏移位置。

创建这个界面的挑战在于:确定设备在什么地方应该具有他的静止轴,大多数人最初建议当显示屏靠在他的背部应该是稳定的,并且z轴方向笔直的指向上方。事实证明:这实际是一个相当糟糕的设计选择。要使用那根轴,就意味着导航期间屏幕必须实际的偏离观看者。随着设备旋转离开视图,用户将不能完全看到屏幕上所发生的事情,尤其是在固定的位置使用设备时,站在高处看设备有时会产生这种效果。

作为代替,下面程序假定稳定的位置是通过z轴指向大约45度的方向,即用户把iPhone或iPad窝在手中的自然位置,这处于正面朝上和正面朝前方的中间位置。从这个歪斜的位置来回倾斜,使屏幕在调整期间保持最大的可见性。

这个程序中的另一处改变是低得多加速常量。这使屏幕上的运动能够更慢的发生,让用户更容易降低速度并恢复导航。

#define SIGN(_NUM_) ((_NUM_ < 0) ? (-1) : 1)
#define MIN(A,B) __NSMIN_IMPL__(A,B,__COUNTER__)
#define MAX(A,B) __NSMAX_IMPL__(A,B,__COUNTER__) @implementation TestBedViewController
{
UIScrollView *sv; float xoff;
float xaccel;
float xvelocity; float yoff;
float yaccel;
float yvelocity;
} - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
// extract the acceleration components
float xx = -acceleration.x;
float yy = (acceleration.z + 0.5f) * 2.0f; // between face up and face forward // Has the direction changed?
float accelDirX = SIGN(xvelocity) * -1.0f;
float newDirX = SIGN(xx);
float accelDirY = SIGN(yvelocity) * -1.0f;
float newDirY = SIGN(yy); // Accelerate. To increase viscosity lower the additive value
if (accelDirX == newDirX) xaccel = (abs(xaccel) + 0.005f) * SIGN(xaccel);
if (accelDirY == newDirY) yaccel = (abs(yaccel) + 0.005f) * SIGN(yaccel); // Apply acceleration changes to the current velocity
xvelocity = -xaccel * xx;
yvelocity = -yaccel * yy;
} - (void) tick
{
xoff += xvelocity;
xoff = MIN(xoff, 1.0f);
xoff = MAX(xoff, 0.0f); yoff += yvelocity;
yoff = MIN(yoff, 1.0f);
yoff = MAX(yoff, 0.0f); CGFloat xsize = sv.contentSize.width - sv.frame.size.width;
CGFloat ysize = sv.contentSize.height - sv.frame.size.height;
sv.contentOffset = CGPointMake(xoff * xsize, yoff * ysize);
} - (void) loadView
{
[super loadView];
sv = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.view = sv;
} - (void) viewDidAppear:(BOOL)animated
{
NSString *map = @"http://maps.weather.com/images/maps/current/curwx_720x486.jpg";
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:
^{
// Load the weather data
NSURL *weatherURL = [NSURL URLWithString:map];
NSData *imageData = [NSData dataWithContentsOfURL:weatherURL]; // Update the image on the main thread using the main queue
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
UIImage *weatherImage = [UIImage imageWithData:imageData];
UIImageView *imageView = [[UIImageView alloc] initWithImage:weatherImage];
CGSize initSize = weatherImage.size;
CGSize destSize = weatherImage.size; while ((destSize.width < (self.view.frame.size.width * )) ||
(destSize.height < (self.view.frame.size.height * )))
{
destSize.width += initSize.width;
destSize.height += initSize.height;
} imageView.userInteractionEnabled = NO;
imageView.frame = (CGRect){.size = destSize};
sv.contentSize = destSize; [sv addSubview:imageView]; // Activate the accelerometer
[[UIAccelerometer sharedAccelerometer] setDelegate:self]; // Start the physics timer
[NSTimer scheduledTimerWithTimeInterval: 0.03f target: self selector: @selector(tick) userInfo: nil repeats: YES];
}];
}];
}

IOS 特定于设备的开发:基于加速计的滚动视图的更多相关文章

  1. IOS 特定于设备的开发:UIDevice

    UIDevice类展示了一些关键的特定于设备的属性,包括使用的iPhone ,Ipad或iPod Touch型号.设备名称.以及OS名称和版本. 他是一种一站式解决方案,用于提取出某些系统详细信息.每 ...

  2. IOS 特定于设备的开发:Info.plist属性列表的设置

    应用程序的Info.plist属性列表使你能够在向iTunes提交应用程序时指定应用程序的要求.这些限制允许告诉iTunes应用程序需要哪些设备特性. 每个IOS单元都会提供一个独特的特性集.一些设备 ...

  3. IOS 特定于设备的开发:Core Motion基础

    Core Motion框架集中了运动数据处理.该框架是在IOS 4 SDK中引入的,用于取代accelerometer加速计访问.它提供了对3个关键的机载传感器的集中式监测.这些传感器有陀螺仪.磁力计 ...

  4. IOS 特定于设备的开发:获取和使用设备姿势(通过手机方向控制3d物体显示)

    利用设备的机载陀螺仪可以实现,当你旋转手机屏幕时,里面的画面不会随着视图更新而移动,以平衡物理运动. 下面例子利用少量简单的几何变换执行该操作.他建立一个运动管理器,订阅设备运动更新,然后基于运动管理 ...

  5. IOS 特定于设备的开发:处理基本方向

    UIDevice类使用内置的orientation属性获取设备的物理方向.IOS设备支持这个属性的7个可能的值. >UIDeviceOrientationUnknown:方向目前未知. > ...

  6. IOS 特定于设备的开发:使用加速器启动屏幕上的对象

    借助一点编程工作,iPhone的机载加速计就可以使对象在屏幕上四处“移动”,实时响应用户倾斜手机的方式.下面的代码就是创建一个动画式的蝴蝶,用户可以使之快速移过屏幕. 使之工作的秘密在于:向程序中添加 ...

  7. IOS 特定于设备的开发:使用加速能力“向上定位”

    iPhone提供了3个机载的传感器,用于沿着iPhone的3根相互垂直的轴(左/右(x轴).上/下(y轴)和前/后(z轴))度量加速能力.这些值指示作用于iPhone的力,它们来自重力和用户移动.可以 ...

  8. IOS 特定于设备的开发:监测Retina支持

    近年来,Apple在其旗舰设备上引入了Retina显示屏.根据Apple的说法,他的像素密度非常高,足以使人眼无法区分单独的像素. UIScreen类提供了一种容易的方式,用于监查当前设备是否提供了内 ...

  9. IOS 特定于设备的开发:检查设备接近度和电池状态

    UIDevice类提供了一些API,使你能够跟踪设备的特征,包括电池的状态和接近度传感器.他们二者都以通知的形式提供更新,可以订阅他们,以便在有重要的更新时通知你的应用程序. 1>启动和禁用接近 ...

随机推荐

  1. CCF计算机认证注意事项

    1,同一变量只使用一次,你是使用同名的局部变量. 2,if()条件语句里面再不要使用单一的if()条件语句. 这应该都是他们系统的bug

  2. Linux学习之查找命令汇总

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:        which  查看可执行文件的位置.       whereis 查看文件的位置.         ...

  3. 关于Centos Linux系统安装Python的问题

    由于最近在研究Python框架Django的使用,安装django扩展没有问题 新建项目  django-admin startproject projectName  如果什么都不修改或者直接创建一 ...

  4. 求一个int型整数的两种递减数之和(华为2015笔试题及答案)

    给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数:2.递减数中各位数之和最大的数)之和. 递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的数位大小相同 ...

  5. Vim 缓冲区与窗口 操作

    ##############缓冲区 :e(:open) 打开新缓冲区 :ls (:buffers) 列出列表内所有缓冲区/bs /bv /be(BufExplore快捷键) :b 2(:buffer ...

  6. Linux文件系统与结构

    一.Linux文件系统结构 /bin 二进制的缩写,用来放置可执行的二进制程序,基本命令 /boot 用来存放启动文件,kernel 和boot配置文件 /dev 用来放置设备文件 /dev/cons ...

  7. 17.java.lang.CloneNotSupportedException

    java.lang.CloneNotSupportedException不支持克隆异常 当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常.

  8. http://webhelp.esri.com/arcgisexplorer/2500/zh-CN/index.html#add_raster_data.htm

    http://webhelp.esri.com/arcgisexplorer/2500/zh-CN/index.html#add_raster_data.htm

  9. 微软 Office 2010 SP2 正式版下载大全(含简中)

    7月24日消息,微软正式为 Office 2010 和 SharePoint 2010 系列产品发布 SP 2服务包,带来重要更新和修复.除了提供产品补丁,SP2服务包还将提升产品的稳定性.性能以及安 ...

  10. git多人协作

    多人协作 当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信息,用git remote: $ ...