Свойство
UIWebView
delegate
позволяет установить только делегата для протокола UIWebViewDelegate
.(Смотрите здесь для UIWebView
ссылки.)
UIWebView
само по себе является UIScrollViewDelegate
, поскольку оно получает вызовы делегатов от UIScrollView
, который он содержит.К сожалению, у вас нет API-доступа к этому UIScrollView
, поэтому вы не можете изменить его делегат;таким образом, он остается жестко запрограммированным для самого UIWebView
.
Теперь есть несколько способов получить эти сообщения делегатов.
Один из способов получить UIScrollViewDelegate
звонки это подкласс UIWebView
, если это работает.В любом случае вы должны быть очень осторожны, потому что в зависимости от того, что вы делаете, вы можете нарушить целостность UIWebView
, и некоторые функции могут перестать работать (возможно, в будущем выпуске SDK).Кроме того, Apple не рекомендует делать это, хотя это не приведет к отклонению вашего приложения (как и многие люди, которые сообщили об этом и не испытывают проблем с одобрением App Store).
Другим подходом может быть повторение subviews
вашего UIWebView
до тех пор, пока вы не найдете UIScrollView
объект и затем не измените его делегат.
UIScrollView* scrollView = nil;
for (UIView* subview in [webView subviews]) {
if ([subview isKindOfClass:[UIScrollView class]]) {
scrollView = (UIScrollView*)subview;
scrollView.delegate = <YOUR_DELEGATE_HERE>;
break;
}
}
Я не уверен, что это надежно или может что-то сломать, поскольку связь между UIWebView
и его UIScrollView
ребенок очень тугой и нигде не описан, но вы можете попробовать.В общем, я не думаю, что это намного лучше, чем создавать подклассы UIWebView
.
Наконец, третий подход - это определение собственного типа UIWindow
.Это позволит вам переопределить несколько ключевых методов (sendEvent
или hitTest:event:
), чтобы вы могли перехватывать касания до того, как они будут отправлены на уровне просмотра.Это даст вам возможность справиться с ними и, в случае необходимости, помешает им достичь своей первоначальной цели.
Это самое чистое решение, хотя это и больше работы, и вам потребуется определить пользовательский UIWindow
где вы делаете все распознавание / диспетчеризацию касания.
Учебник, описывающий, как переопределить sendEvent
, доступен здесь .