转载自:http://www.cocoachina.com/iphonedev/sdk/2011/0509/2843.html
UIView 继承的 UIResponder (负责 UI 事件处理) 类中提供了四个方法处理多点触控:
- (void)touchesBegan:(NSSet
*)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
touchesBegan 方法在触控开始时被调用,
touchesMoved 方法在触控移动时被调用
touchesEnded 方法在触控结束时被调用
touchesCancelled 方法在系统强制结束触控时被调用
上述方法的参数:
-
event 为触控动作引发的 UI 事件,只有发生了 UI 事件 UIResponder 的相应处理方法才会被调用。传递给上述方法的 UI 事件都是 “touch” 类型的,它关联了一系列 UITouch 对象来代表发生该事件时所有处于各种状态 (began, moved, ended, cancelled) 下的触控动作。
-
touches 同样是一系列 UITouch 对象的集合 (NSSet),不过它只包含处于特定状态的触控动作。比方说调用 touchesBegan 时传递的就是所有处在 began 状态 (phase) 的 UITouch 对象。
相关类型说明:
-
UIEvent 对象代表了 iPhone OS 中一个UI事件,主要有三种类型:touch,motion,remote control。
-
UITouch对象代表一根手指在某一个UI事件发生时刻的动作,它有四种状态(phase),began, moved, ended, cancelled。
-
触控动作会引发 touch 类的UI事件,而这个 UI 事件中也就包括了一系列 UITouch 对象来记录当时的所有手指的动作。当 touch 类型的 UI 事件发生的时候会被交给 UIResponder 处理,继而调用上述四个方法。
OpenGL ES 程序模板中的多点触控处理
-
OES 程序模板中的类继承关系为 EAGLView :UIView :UIResponder
-
在 EAGLView 类中实现了上述四个方法,并分别在其中用不同的标签调用 ESRenderer 的 view 方法。
-
ESRenderer 协议(就是接口)中提供了四个同名同参的 view 方法,用标签来区分调用:
@optional
- (void)view:(UIView*)view touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;
- (void)view:(UIView*)view touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event;
- (void)view:(UIView*)view touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event;
- (void)view:(UIView*)view touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event;
-
实现了 ESRenderer 接口的 ES1Renderer 和 ES2Renderer 最终在 View 方法中负责触控事件的处理。
获取各种触控信息的方法
获取触控对象(UITouch)
-
通过 event 参数获取 UITouch 集合
//所有关联的UITouch
- (NSSet *)allTouches;
//指定窗口的UITouch
- (NSSet *)touchesForWindow:(UIWindow *)window;
//指定View上的UITouch
- (NSSet *)touchesForView:(UIView *)view;
- (NSSet *)touchesForGestureRecognizer:(UIGestureRecognizer *)gesture __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_2);
-
touches 参数本身就是处在当前状态的UITouch集合
-
从 touches 集合中随机获取一个UITouch
[touches anyObject];
UITouch 对象的各种属性
-
timestamp 这个触控对象最后改变的时间戳。 用从系统启动到现在的时间来表示,float类型。开始时和移动时会更新。
-
tapCount 连续点击的次数。一旦中断就重新计数。
-
phase 这个触控对象的所处状态。 枚举类型。
-
locationInView() 在自己所属View中的位置。
示例代码( Metronome by Apple )
- (void)touchesBegan:(NSSet
*)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
lastLocation = [touch locationInView:self];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
CGPoint location = [touch locationInView:self];
CGFloat xDisplacement = location.x - lastLocation.x;
CGFloat yDisplacement = location.y - lastLocation.y;
CGFloat xDisplacementAbs = fabs(xDisplacement);
CGFloat yDisplacementAbs = fabs(yDisplacement);
// If the displacement is vertical, drag the weight up or down. This will impact the speed of the oscillation.
if ((xDisplacementAbs 1)) {
[self stopSoundAndArm];
[self dragWeightByYDisplacement:yDisplacement];
lastLocation = location;
tempoChangeInProgress = YES;
} else if (xDisplacementAbs >= yDisplacementAbs) {
// If displacement is horizontal, drag arm left or right. This will start oscillation when the touch ends.
CGFloat radians = atan2f(location.y - kArmBaseY, location.x - kArmBaseX);
CGFloat rotation = RadiansToDegrees(radians) + 90.0;
[self rotateArmToDegree:rotation];
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
CGPoint location = [touch locationInView:self];
CGFloat xDisplacement = location.x - lastLocation.x;
CGFloat yDisplacement = location.y - lastLocation.y;
CGFloat xDisplacementAbs = fabs(xDisplacement);
CGFloat yDisplacementAbs = fabs(yDisplacement);
[self stopSoundAndArm];
if (tempoChangeInProgress) {
[self dragWeightByYDisplacement:yDisplacement];
[self startSoundAndAnimateArmToRight:YES];
tempoChangeInProgress = NO;
} else if (xDisplacementAbs > yDisplacementAbs) {
// horizontal displacement, start oscillation
BOOL startToRight = (xDisplacement >= 0.0) ? YES : NO;
[self startSoundAndAnimateArmToRight:startToRight];
}
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
tempoChangeInProgress = NO;
[self stopSoundAndArm];
}
分享到:
相关推荐
- **事件处理**:解析事件处理模型,教授多点触控、运动事件处理,以及拷贝粘贴操作集成。 - **图形和描画**:阐述iPhoneOS图形架构,指导形状和图像描绘,动画使用。 - **文本和Web**:介绍文本处理和支持,举例...
- **设备特性**:iPhone和iPod touch是结合了革命性的多点触控界面与强大功能(如电子邮件、即时通讯能力、全功能网络浏览器、iPod播放器以及iPhone上的移动电话功能)的先进设备。 - **系统软件**:iPhone OS作为...
- 可以充分利用设备的功能,如加速计、位置服务、多点触控等。 - 能够将数据保存在本地文件系统中。 - 可以通过定制的URL与其他应用进行交互。 #### 三、UIKit框架 - **框架介绍**:UIKit框架是iOS开发的核心...
6. **触摸与重力感应**:iPhone的多点触控屏幕和内置的加速度计为游戏带来了独特的交互方式。书中会教授如何处理触摸事件和利用重力感应器来增强游戏的沉浸感。 7. **游戏设计原则**:除了技术细节,本书还会讨论...
- **特性访问**:本地应用程序能够访问iPhone的所有特性,如加速度计、位置服务和多点触控接口,这使得应用更加互动和吸引用户。 - **数据存储与通信**:本地应用程序不仅能在本地文件系统中保存数据,还能通过定制...
- **多点触控**:探讨了多点触控支持下的新交互模式,以及如何利用这些特性来增强用户体验。 6. **无障碍设计** - **辅助功能**:强调了为视力障碍用户设计应用程序的重要性,包括文字大小调整、语音反馈等功能。...
2. iPhone平台特性:讨论iPhone的独特硬件和软件特性,如多点触控屏幕、Home键、通知中心等,以及如何利用这些特性来增强用户体验。 3. iOS设计指南:详述Apple的iOS设计指南,包括界面设计、图标设计、色彩和字体...
- **设备特性**:iPhone及iPod touch集成了革命性的多点触控技术,具备邮件、即时通讯、浏览器、iPod播放器以及iPhone特有的电话功能等强大能力。 - **操作系统**:iOS作为专为这些设备设计的操作系统,不仅提供了...
例如,可能涉及到Core Data、Core Location、GameKit等框架,以及如何利用多点触控和加速度计等功能。同时,书中的内容可能未涵盖后来引入的新技术,如Swift编程语言、Auto Layout、Storyboards或今日扩展等。 随着...
- **多点触控**:支持多点触控,允许用户同时触摸屏幕的不同位置。 - **手势识别**:提供了对常见手势(如捏合、旋转等)的支持。 - **推送通知**:允许应用程序接收远程通知并在适当的时候提醒用户。 #### 五、...
1. **触摸交互**:iPhone 和 iPad 的触控屏技术非常先进,支持多点触控,能够实现各种复杂的触摸手势,如滑动、缩放等。 2. **高清视网膜屏幕**:高分辨率的显示屏提供了清晰细腻的视觉体验,这对于图形密集型应用尤...
开发者可以使用SDK创建原生的iOS应用,充分利用设备的硬件特性,如多点触控、GPS、加速度计等。 在AppStore掘金的过程中,了解并掌握Objective-C至关重要。Objective-C是iOS开发的主要语言,它是C语言的超集,引入...
- **手势识别器**:利用多点触控技术,通过手势(如捏合、滑动)来控制界面。 - **动态效果**:添加动画和过渡效果,使界面更加生动有趣。 - **触觉反馈**:通过震动等方式给予用户即时反馈。 #### 4. 文字和图像 ...
- **多点触控支持**:探讨了如何利用多点触控功能实现更复杂的用户交互,例如缩放和平移操作。 - **手势识别**:介绍如何利用iOS内置的手势识别库来简化复杂的手势检测逻辑。 #### 六、高级编程主题:Canvas与视频 ...