Требуется несколько просмотров для ответа на сенсорное событие в приложении для iPhone - PullRequest
0 голосов
/ 04 марта 2010

Настройка: У меня есть два представления, которые мне нужны, чтобы ответить на сенсорное событие, и они расположены друг над другом. Представление 1 находится сверху представления 2. Представление 2 является UIWebView. Вид 1 является субклассовым для захвата события касания.

Моя проблема заключается в том, что если я пытаюсь вызвать обработчики событий UIWebView (touchesBegan: и touchesEnded :) из обработчиков событий View 1, который является первым респондентом, ничего не происходит. Однако, если я установил для View 1 значение userInteractionEnabled = NO, то касание проходит через это представление и обрабатывается соответствующим образом во втором представлении.

Есть какие-нибудь идеи о том, как можно, чтобы два просмотра отвечали на сенсорное событие? К сожалению, второе представление - это UIWebView, поэтому мне нужно вызвать обработчик события, а не другой метод и т. Д.

Заранее спасибо за любые советы, Joel

1 Ответ

1 голос
/ 31 мая 2010

Вот решение моей проблемы. Он работает на всех видах UIView! Если кто-то хочет улучшить этот код на

catchUIEventTypeMotion default: ...

Я надеюсь, что этот код будет вам полезен.

PJ.

CustomWindow.h

#import <Foundation/Foundation.h>

@interface CustomWindow : UIWindow {
}

- (void) sendEvent:(UIEvent *)event;

@end

CustomWindow.m

#import "CustomWindow.h"

@implementation CustomWindow

- (void) sendEvent:(UIEvent *)event
{       
    switch ([event type])
    {
        case UIEventTypeMotion:
            NSLog(@"UIEventTypeMotion");
            [self catchUIEventTypeMotion: event];
            break;

        case UIEventTypeTouches:
            NSLog(@"UIEventTypeTouches");
            [self catchUIEventTypeTouches: event];
            break;      

        default:
            break;
    }
    /*IMPORTANT*/[super sendEvent:(UIEvent *)event];/*IMPORTANT*/
}

- (void) catchUIEventTypeTouches: (UIEvent *)event
{
    for (UITouch *touch in [event allTouches])
    {
        switch ([touch phase])
        {
            case UITouchPhaseBegan:
                NSLog(@"UITouchPhaseBegan");
                break;

            case UITouchPhaseMoved:
                NSLog(@"UITouchPhaseMoved");
                break;

            case UITouchPhaseEnded:
                NSLog(@"UITouchPhaseEnded");
                break;

            case UITouchPhaseStationary:
                NSLog(@"UITouchPhaseStationary");
                break;

            case UITouchPhaseCancelled:
                NSLog(@"UITouchPhaseCancelled");
                break;

            default:
                NSLog(@"iPhone touched");
                break;
        }
    }
}

- (void) catchUIEventTypeMotion: (UIEvent *)event
{
    switch ([event subtype]) {
        case UIEventSubtypeMotionShake:
            NSLog(@"UIEventSubtypeMotionShake");
            break;

        default:
            NSLog(@"iPhone in movement");
            break;
    }
}

@end

AppDelegate.h

#import <UIKit/UIKit.h>
#import "CustomWindow.h"

@interface AppDelegate : NSObject <UIApplicationDelegate>
{
    CustomWindow *window;
}

@property (nonatomic, retain) IBOutlet CustomWindow *window;

@end
...