Use File::Spec;
File::Spec->rel2abs( __FILE__ );
Как я читаю ваш вопрос, вы хотите перехватывать события , чтобы инициировать какое-либо действие (анимировать панель инструментов, отправлять уведомление), при этом позволяя событию также достигать его естественное предназначение.
Если бы я пытался сделать это, я бы поместил 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;
}
Если вы начнете с добавления подкласса 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, с которыми вы имеете дело. Я не уверен, включаю ли я нужные чеки или они уловят именно то условие, которое вы ищете.
Удачи!
Хорошо, а как насчет этого:
-В пользовательском подклассе 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:
в качестве задержки до обрабатывать ситуации двойного нажатия, но я думаю, что в целом идея правильная ... возможно?
Возьмите 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];
}
Это работает ... вроде как. Это позволяет перетаскивать веб-представление. Но он не обрабатывает другие сенсорные события должным образом (переход по ссылкам, защемление и т. Д.). Так. Наверное, не очень полезно, но для меня это был прогресс!