Проведите HTML-страницЗагрузите другую HTML-страницу, если я проведу по горизонтали - PullRequest
0 голосов
/ 18 февраля 2012

Как можно было бы пролистывать (левые) HTML-страницы?

1 Ответ

0 голосов
/ 18 февраля 2012

Обработка жестов, происходящих в веб-представлении, является сложной задачей, поскольку UIWebView действительно жаден с касаниями и хочет обрабатывать их все.

Как обычно с веб-представлениями, вы можете попробовать сделать все с помощью Javascript.Вы можете прочитать об этом в этом ТАК сообщении .

Способ, которым я предпочитаю управлять сжатием (масштабированием) и прокруткой в ​​веб-представлении, выглядит следующим образом:

  1. подкласс UIWindow:

       @interface MyWebNavigatorWindow : UIWindow {
    
  2. установить экземпляр этого типа окна в качестве окна для вашего приложения в application:didFinishLaunchingWithOptions:

      _window = [[MyWebNavigatorWindow alloc] initWithFrame:rect];
    

    В качестве альтернативы, вы можете назначить класс вашему объекту окна в Интерфейсном Разработчике.

  3. обрабатывать удары и зажимы в sendEvent в вашем MyWebNavigatorWindow классе:

      - (void)sendEvent:(UIEvent*)event {
        NSSet* allTouches = [event allTouches];
        UITouch* touch = [allTouches anyObject];
        UIView* touchView = [touch view];
    
  4. Вам понадобится механизм в sendEventчтобы определить, когда происходит касание в вашем веб-представлении.В моем случае я «регистрирую» все виды, для которых хочу обработать касание, а затем проверяю, находится ли касание внутри них:

            for (UIView* view in self.controlledViews) {  // self.controlledViews is the array of all "registered" views
          if ([touchView isDescendantOfView:view]) {
    
  5. , затем я обрабатываю различные фазы касаниячтобы определить, какой это жест (фрагмент кода не компилируется, но он дает идею):

            if (touch.phase == UITouchPhaseBegan) {
            NSLog(@"TOUCH BEGAN");
            _initialView = touchView;
            startTouchPosition1 = [touch locationInView:self];
            startTouchTime = touch.timestamp;
    
            if ([allTouches count] > 1) {
                startTouchPosition2 = [[[allTouches allObjects] objectAtIndex:1] locationInView:self];
                previousTouchPosition1 = startTouchPosition1;
                previousTouchPosition2 = startTouchPosition2;
            }
        }
    
        if (touch.phase == UITouchPhaseMoved) {
            NSLog(@"TOUCH MOVED");
            if ([allTouches count] > 1) {
                CGPoint currentTouchPosition1 = [[[allTouches allObjects] objectAtIndex:0] locationInView:self];
                CGPoint currentTouchPosition2 = [[[allTouches allObjects] objectAtIndex:1] locationInView:self];
    
                CGFloat currentFingerDistance = CGPointDist(currentTouchPosition1, currentTouchPosition2);
                CGFloat previousFingerDistance = CGPointDist(previousTouchPosition1, previousTouchPosition2);
                if (fabs(currentFingerDistance - previousFingerDistance) > ZOOM_DRAG_MIN) {
                    NSNumber* movedDistance = [NSNumber numberWithFloat:currentFingerDistance - previousFingerDistance];
                    if (currentFingerDistance > previousFingerDistance) {
                        NSLog(@"zoom in");
                        [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_ZOOM_IN object:movedDistance];
                    } else {
                        NSLog(@"zoom out");
                        [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_ZOOM_OUT object:movedDistance];
                    }
                }
            }
        }
    
        if (touch.phase == UITouchPhaseEnded) {
            CGPoint currentTouchPosition = [touch locationInView:self];
    
            // Check if it's a swipe
            if (fabsf(startTouchPosition1.x - currentTouchPosition.x) >= SWIPE_DRAG_HORIZ_MIN &&
                fabsf(startTouchPosition1.x - currentTouchPosition.x) > fabsf(startTouchPosition1.y - currentTouchPosition.y) &&
                touch.timestamp - startTouchTime < 0.7
                ) {
                // It appears to be a swipe.
                if (startTouchPosition1.x < currentTouchPosition.x) {
                    NSLog(@"swipe right");
                    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_SWIPE_RIGHT object:touch];
                } else {
                    NSLog(@"swipe left");
                    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_SWIPE_LEFT object:touch];
                }
            }
            startTouchPosition1 = CGPointMake(-1, -1);
            _initialView = nil;
        }
    
...