iPhone - жесты UIWebView - PullRequest
       24

iPhone - жесты UIWebView

0 голосов
/ 16 февраля 2010

У меня есть viewcontrollers, настроенные для отслеживания жестов и совершения действий, в этом случае измените вкладку. Код для контроллеров представления выглядит следующим образом:

#define HORIZ_SWIPE_DRAG_MIN 100
CGPoint mystartTouchPosition;
BOOL isProcessingListMove;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint newTouchPosition = [touch locationInView:self.view];
    if(mystartTouchPosition.x != newTouchPosition.x || mystartTouchPosition.y != newTouchPosition.y) {
        isProcessingListMove = NO;
    }
    mystartTouchPosition = [touch locationInView:self.view];
    [super touchesBegan:touches withEvent:event];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *touch = touches.anyObject;
    CGPoint currentTouchPosition = [touch locationInView:self.view];

    // If the swipe tracks correctly.
    double diffx = mystartTouchPosition.x - currentTouchPosition.x + 0.1; // adding 0.1 to avoid division by zero
    double diffy = mystartTouchPosition.y - currentTouchPosition.y + 0.1; // adding 0.1 to avoid division by zero

    if(abs(diffx / diffy) > 2.5 && abs(diffx) > HORIZ_SWIPE_DRAG_MIN)
    {
        // It appears to be a swipe.
        if(isProcessingListMove) {
            // ignore move, we're currently processing the swipe
            return;
        }

        if (mystartTouchPosition.x < currentTouchPosition.x) {
            isProcessingListMove = YES;
            self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:0];
            return;
        }
        else {
            isProcessingListMove = YES;

            self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:2];

            return;
        }
    }
    else if(abs(diffy / diffx) > 1)
    {
        isProcessingListMove = YES;
        [super touchesMoved:touches withEvent:event];
    }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{
    isProcessingListMove = NO;
    [super touchesEnded:touches withEvent:event];
}

Я бы хотел, чтобы тот же жест делал то же самое в uiwebview, который я настроил под view-контроллером представления. Короче говоря, uiwebview на виду. Когда я смахиваю, я просто получаю основные функции uiwebview (прокрутка). Если я настраиваю пользовательский класс uiwebview с тем же кодом, что и контроллер uiview, я получаю ошибки. Мне нужно знать, как перевести этот блок кода, сохранив функциональность, в соответствии с uiwebview.

Ответы [ 2 ]

1 голос
/ 16 февраля 2010

Вы должны иметь возможность наследовать UIWebView и переопределять эти методы. Возможно, вам придется переопределить все сенсорные методы,

- (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

EDIT: Ах, я вижу твои ошибки сейчас. Это потому, что эти вещи не относятся к UIWebView, как они применили к родителю (что вы уже знаете ...)

Поскольку UIWebView является UIView, вы должны иметь возможность заменить

[touch locationInView:self.view]

с

[touch locationInView:self]

Чтобы добраться до контроллера панели вкладок родителя, вам придется придумать другой способ сделать это. Вы можете передать ссылку на родителя в свой подкласс UIWebView и предоставить метод для родителя для изменения активной вкладки, например:

В своем подклассе добавьте свойство для родительского контроллера панели вкладок:

UITabBarController *parent;

При создании подкласса UIWebView и добавлении его в контроллер панели вкладок также установите родительский элемент:

webView.parent = self;

Если вы настраиваете это в Интерфейсном Разработчике, сделайте родительский объект IBOutlet и подключите его через IB.

В представлении контроллера панели вкладок добавьте метод, который изменяет выбранный контроллер. Вы можете использовать именованные константы для представления, на которое вы хотите переключиться, или методы, которые точно описывают то, на что вы переключаетесь, но для простоты вы бы сделали нечто концептуально похожее на это:

- (void) switchToView: (int)viewNumber 
{
    self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:viewNumber]; 
}

, затем наберите [parent switchToView:2] в своем коде.

Другой, возможно, лучший способ - использовать NSNotification s, регистрируя родителя в качестве слушателя.

0 голосов
/ 16 февраля 2010

Мой полный код следующий:

#import "CustomWebView.h"

@implementation CustomWebView

//Swipe between tabs
#define HORIZ_SWIPE_DRAG_MIN 100
CGPoint mystartTouchPosition;
BOOL isProcessingListMove;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint newTouchPosition = [touch locationInView:self.view]; "error: request for member 'view' in something not a structure or union"


    if(mystartTouchPosition.x != newTouchPosition.x || mystartTouchPosition.y != newTouchPosition.y) {
        isProcessingListMove = NO;
    }
    mystartTouchPosition = [touch locationInView:self.view]; "error: request for member 'view' in something not a structure or union"
    [super touchesBegan:touches withEvent:event];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *touch = touches.anyObject;
    CGPoint currentTouchPosition = [touch locationInView:self.view]; "error: request for member 'view' in something not a structure or union"

    // If the swipe tracks correctly.
    double diffx = mystartTouchPosition.x - currentTouchPosition.x + 0.1; // adding 0.1 to avoid division by zero
    double diffy = mystartTouchPosition.y - currentTouchPosition.y + 0.1; // adding 0.1 to avoid division by zero

    if(abs(diffx / diffy) > 2.5 && abs(diffx) > HORIZ_SWIPE_DRAG_MIN)
    {
        // It appears to be a swipe.
        if(isProcessingListMove) {
            // ignore move, we're currently processing the swipe
            return;
        }

        if (mystartTouchPosition.x < currentTouchPosition.x) {
            isProcessingListMove = YES;
            self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:0]; "error: request for member 'tabBarController' in something not a structure or union"
            return;
        }
        else {
            isProcessingListMove = YES;

            self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:2]; "error: request for member 'tabBarController' in something not a structure or union"

            return;
        }
    }
    else if(abs(diffy / diffx) > 1)
    {
        isProcessingListMove = YES;
        [super touchesMoved:touches withEvent:event];
    }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{
    isProcessingListMove = NO;
    [super touchesEnded:touches withEvent:event];
}
// End of swipe

@end

Ошибки заключаются в том, что включены в код.

Я ценю помощь.

...