我有一个带有 ScrollView 的 iPhone 应用程序,它需要响应触摸事件。
为了支持滚动视图中的触摸事件,我需要将它基于一个自定义类,该类捕获触摸事件并将它们传递给主视图。
在 4.3 iPhone 模拟器中运行时,它按预期工作。使用 NSLOG 条目,我得到如下输出:
2011-10-17 09:28:06.782 SingleView[7000:b303] gameTable began
2011-10-17 09:28:06.784 SingleView[7000:b303] outside began
2011-10-17 09:28:09.976 SingleView[7000:b303] gameTable moved
2011-10-17 09:28:09.976 SingleView[7000:b303] outside moved
2011-10-17 09:28:09.977 SingleView[7000:b303] gameTable moved
2011-10-17 09:28:09.978 SingleView[7000:b303] outside moved
2011-10-17 09:28:10.019 SingleView[7000:b303] gameTable moved
2011-10-17 09:28:10.020 SingleView[7000:b303] outside moved
2011-10-17 09:28:10.046 SingleView[7000:b303] gameTable moved
2011-10-17 09:28:10.047 SingleView[7000:b303] outside moved
2011-10-17 09:28:10.077 SingleView[7000:b303] gameTable moved
2011-10-17 09:28:10.077 SingleView[7000:b303] outside moved
2011-10-17 09:28:10.143 SingleView[7000:b303] gameTable moved
2011-10-17 09:28:10.144 SingleView[7000:b303] outside moved
2011-10-17 09:28:12.433 SingleView[7000:b303] gameTable ended
2011-10-17 09:28:12.434 SingleView[7000:b303] outside ended
gameTable 是自定义类中的事件,它只是将它传递给外部视图。
如果您在 iOS 5 iPhone 模拟器中运行相同的应用程序,您会得到如下输出:
2011-10-17 09:41:46.319 SingleView[7077:f803] gameTable began
2011-10-17 09:41:46.322 SingleView[7077:f803] outside began
2011-10-17 09:41:47.851 SingleView[7077:f803] gameTable moved
2011-10-17 09:41:47.852 SingleView[7077:f803] outside moved
2011-10-17 09:41:47.853 SingleView[7077:f803] gameTable moved
2011-10-17 09:41:47.860 SingleView[7077:f803] gameTable moved
2011-10-17 09:41:47.893 SingleView[7077:f803] gameTable moved
2011-10-17 09:41:47.916 SingleView[7077:f803] gameTable moved
2011-10-17 09:41:47.945 SingleView[7077:f803] gameTable moved
2011-10-17 09:41:48.009 SingleView[7077:f803] gameTable moved
2011-10-17 09:41:48.062 SingleView[7077:f803] gameTable moved
请注意,外部移动事件仅触发一次。
这是代码。这是 Xcode 中的单视图项目。
//
// XYZAppDelegate.h
// SingleView
//
#import <UIKit/UIKit.h>
@class XYZViewController;
@interface XYZAppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) XYZViewController *viewController;
@end
//
// XYZAppDelegate.m
// SingleView
//
#import "XYZAppDelegate.h"
#import "XYZViewController.h"
@implementation XYZAppDelegate
@synthesize window = _window;
@synthesize viewController = _viewController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[XYZViewController alloc] initWithNibName:@"XYZViewController" bundle:nil];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
@end
//
// XYZViewController.h
// SingleView
//
#import <UIKit/UIKit.h>
#import "GameTableScrollView.h"
@interface XYZViewController : UIViewController <UIScrollViewDelegate> {
IBOutlet GameTableScrollView *outsideScrollView;
}
@property (nonatomic, retain) GameTableScrollView *outsideScrollView;
@end
//
// XYZViewController.m
// SingleView
//
#import "XYZViewController.h"
@implementation XYZViewController
@synthesize outsideScrollView;
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[outsideScrollView setScrollEnabled:NO];
[outsideScrollView setContentSize:CGSizeMake(480,555)];
}
// Handles the start of a touch
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"outside began");
}
// Handles the continuation of a touch.
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"outside moved");
}
// Handles the end of a touch event.
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"outside ended");
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"outside cancelled");
}
@end
//
// GameTableScrollView.h
//
#import <UIKit/UIKit.h>
@interface GameTableScrollView : UIScrollView <UIScrollViewDelegate> {
}
@end
//
// GameTableScrollView.m
//
#import "GameTableScrollView.h"
@implementation GameTableScrollView
#pragma mark - Touch
// Handles the start of a touch
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"gameTable began");
if (!self.dragging) {
[self.nextResponder touchesBegan:touches withEvent:event];
}
else [super touchesBegan:touches withEvent:event];
}
// Handles the continuation of a touch.
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"gameTable moved");
if (!self.dragging) {
[self.nextResponder touchesMoved:touches withEvent:event];
}
else [super touchesMoved:touches withEvent:event];
}
// Handles the end of a touch event.
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"gameTable ended");
if (!self.dragging) {
[self.nextResponder touchesEnded:touches withEvent:event];
}
else [super touchesEnded:touches withEvent:event];
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"gameTable cancelled");
if (!self.dragging) {
[self.nextResponder touchesCancelled:touches withEvent:event];
}
else [super touchesCancelled:touches withEvent:event];
}
@end