Из того, что я видел, UIWebView плохо взаимодействует с другими. Для распознавателей жестов вы можете попробовать вернуть YES из:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
Я должен был быть обратно совместимым с 3.0, поэтому я закончил всю обработку жестов с помощью Javascript внутри UIWebView. Не очень хорошее решение, но оно сработало для моих нужд. Мне удалось запечатлеть долгое нажатие на элемент, а также нажать, пролистать, ущипнуть и повернуть. Конечно, я использовал только локальный контент.
Edit:
Вы можете посмотреть в PhoneGap пример отправки сообщений делегату UIWebView. Одним словом, вы используете document.location = "myscheme:mycommand?myarguments"
, а затем анализируете команду и аргументы из этого обратного вызова делегата:
-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
if ( [[[inRequest URL] absoluteString] hasPrefix:@"myscheme:"] ) {
//.. parse arguments
return NO;
}
}
В коде PhoneGap видно, что они настроили очередь и таймер для отправки сообщений. В зависимости от вашего использования, вам может потребоваться сделать то же самое. На эту тему есть другие вопросы по SO.
Вот документация Обработка событий . В моем случае я добавил слушателей событий в document
из <body onload="myloader();">
function myloader() {
document.addEventListener( 'touchcancel' , touch_cancel , false );
document.addEventListener( 'touchstart' , touch_start , false );
document.addEventListener( 'touchmove' , touch_move , false );
document.addEventListener( 'touchend' , touch_end , false );
};
Фактическая обработка событий во многом зависит от ваших потребностей. Каждый обработчик события получит TouchEvent со свойством touch, где каждый элемент имеет значение Touch . Вы можете записать время начала и местоположение в вашем обработчике сенсорного запуска. Если касания перемещаются далеко или проходит неправильное количество времени, это не длинное касание.
WebKit может попытаться обработать длинное касание, чтобы начать выделение и копировать. В вашем обработчике событий вы можете использовать event.preventDefault();
, чтобы остановить поведение по умолчанию. Я также нашел свойство -webkit-user-select:none
css удобным для некоторых вещей.
var touch = {};
function touch_start( event /*TouchEvent*/ {
event.preventDefault();
touch = {};
touch.startX = event.touches.item(0).pageX;
touch.startY = event.touches.item(0).pageY;
touch.startT = ( new Date() ).getTime();
}
Это всего лишь второй проект, с которым я использовал javascript. Вы можете найти лучшие примеры в другом месте.
Как видите, это не быстрый ответ на вашу проблему. Я очень доволен результатами, которые получил. В HTML, с которым я работал, не было никаких интерактивных элементов, кроме одной или двух ссылок.