2

我有一个带有 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
4

1 回答 1

0

我最近发布了一个类似问题的答案

GameTableScrollView你有这个代码:

-(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];
}

要解决此问题,您需要更改此行:

[self.nextResponder touchesBegan:touches withEvent:event];

对此:

[[self.nextResponder nextResponder] touchesBegan:touches withEvent:event];

这将导致将GameTableScrollView触摸事件传递给外部视图。

于 2013-06-14T10:26:07.020 回答