Какие работы передать касания до (и отобразить все) подпредставления?

Use File::Spec;
File::Spec->rel2abs( __FILE__ );

http://perldoc.perl.org/File/Spec/Unix.html

7
задан Community 8 February 2017 в 14:17
поделиться

4 ответа

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

Если бы я пытался сделать это, я бы поместил UIToolbar непосредственно как подвид UIViewController.view . UIWebView также остается прямым подвидом.

UIViewController.view должен быть подклассом UIView , и ему необходимо переопределить

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

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

Примером может быть:

- (UIView *)hitTest:(CGPoint) point withEvent:(UIEvent *)event {
    UIView* subview = [super hitTest:point withEvent:event];
    /* Use the event.type, subview to decide what actions to perform */
    // Optionally nominate a default event recipient if your view is not completely covered by subviews
    if (subview == self) return self.webViewOutlet;
    return subview;
}
2
ответ дан 7 December 2019 в 12:21
поделиться

Если вы начнете с добавления подкласса UIView к представлению контроллера представления, а затем добавите UIWebView, как вы описываете, UIWebView будет полностью охватывать подкласс UIView (при условии, что оба представления полностью перекрываются, поскольку вы упоминаете в комментариях к вопросу).

Похоже, вы этого не хотите - вам нужен подкласс над веб-представлением. Вам нужно либо добавить их в представление контроллера представления в обратном порядке (добавить веб-представление, затем добавить пользовательский UIView), либо вызвать:

[viewContoller.view insertSubview:webView belowSubview:subclass];

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

Идея состоит в том, чтобы создать подкласс UIApplication и переопределить метод -sendEvent :. Полагаю, ваш будет выглядеть примерно так:

- (void)sendEvent:(UIEvent *)event {
    [super sendEvent:event];

    NSSet *allTouches = [event allTouches];
    if ([allTouches count] > 0) {
        UITouch *touch = [allTouches anyObject];
        if ([allTouches count] == 1 && touch.phase == UITouchPhaseEnded && touch.tapCount == 1) {
            // Do something here
        }
    }
}

Не думаю, что это даст вам 100% результат, но, надеюсь, это только начало. В частности, вы можете захотеть поиграть с условием if, которое проверяет свойства UITouches, с которыми вы имеете дело. Я не уверен, включаю ли я нужные чеки или они уловят именно то условие, которое вы ищете.

Удачи!

1
ответ дан 7 December 2019 в 12:21
поделиться

Хорошо, а как насчет этого:

-В пользовательском подклассе UIView добавьте указатель на свой UIWebView

-Добавьте ivar в Подкласс UIView , BOOL hasMoved;

-В подклассе UIView переопределите методы касания следующим образом:

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    hasMoved = NO;
    [webView touchesBegan:touches withEvent:event];
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    hasMoved = YES;
    [webView touchesMoved:touches withEvent:event];
}

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if(!hasMoved) [self hideToolbar];
    [webView touchesEnded:touches withEvent:event];
}

И затем поместите настраиваемое представление поверх веб-просмотр. Кажется слишком простым, и, вероятно, так оно и есть - для правильной обработки нескольких касаний может потребоваться некоторая магия, и вам может потребоваться использовать NSTimer в методе touchesBegan: в качестве задержки до обрабатывать ситуации двойного нажатия, но я думаю, что в целом идея правильная ... возможно?

1
ответ дан 7 December 2019 в 12:21
поделиться

Возьмите 2: то же, что и выше, но переопределите методы следующим образом:

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    hasMoved = NO;
    [[[webView subviews] objectAtIndex:0] touchesBegan:touches withEvent:event];
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    hasMoved = YES;
    [[[webView subviews] objectAtIndex:0] touchesMoved:touches withEvent:event];
}

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if(!hasMoved) [self toggleToolbar];
    [[[webView subviews] objectAtIndex:0] touchesEnded:touches withEvent:event];
}

-(void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    [[[webView subviews] objectAtIndex:0] touchesCancelled:touches withEvent:event];
}

Это работает ... вроде как. Это позволяет перетаскивать веб-представление. Но он не обрабатывает другие сенсорные события должным образом (переход по ссылкам, защемление и т. Д.). Так. Наверное, не очень полезно, но для меня это был прогресс!

1
ответ дан 7 December 2019 в 12:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: