Я делаю то, что вы ищете в проекте, над которым я недавно работал.
По сути, у меня есть UIWebView внутри UINavigationController с UIToolbar в качестве родственного элемента UIWebView.Я установил макет всего этого, используя IB, чтобы создать кончик, связанный с моим классом контроллера представления.Я предполагаю, что вы знаете, как использовать IB и как правильно настроить все делегаты, IBOutlets и т. Д., Поэтому здесь это не рассматривается.
Вам необходимо реализовать соответствующие делегаты в вашем контроллере представления для этого для всехРабота.Вот мой интерфейс для класса контроллера представления:
@interface MyViewController : UIViewController <UIWebViewDelegate, UIGestureRecognizerDelegate> {
}
@property (retain) IBOutlet UIWebView *webView;
@property (retain) IBOutlet UINavigationItem *navigationItem;
@property (retain) IBOutlet UIToolbar *toolbar;
- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer;
// UIGestureRecognizerDelegate methods
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
// UIWebViewDelegate methods
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- (void)webViewDidStartLoad:(UIWebView *)webView;
- (void)webViewDidFinishLoad:(UIWebView *)webView;
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
@end
Технически, о чем вы спрашиваете, требуется только реализация UIGestureRecognizerDelegate, но я предполагаю, что вы будете делать что-то интересное в вашем webView и, следовательно, захотите также реализоватьUIWebViewDelegate
Я обнаружил, что крайне важно реализовать следующее для этих трех методов делегата UGestureRecognizer, чтобы все это работало, поскольку UIWebView также распознает касания:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
return YES;
}
Я регистрирую UITapGestureRecognizer наwebView в методе viewDidLoad моего контроллера:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
// I perform other appropriate initialization here like adding or removing items from the navigation bar or toolbar
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
tapRecognizer.numberOfTapsRequired = 1;
tapRecognizer.delegate = self;
[self.webView addGestureRecognizer:tapRecognizer];
[tapRecognizer release];
}
Вот мой обратный вызов handleTapFrom:
- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer
{
CGPoint location = [recognizer locationInView:self.navigationController.topViewController.view];
CGRect bounds = self.navigationController.topViewController.view.bounds;
if (location.x < bounds.size.width / 5.0) {
// This is in the left most quadrant
// I implement code here to perform a "previous page" action
} else if (location.x > bounds.size.width * 4.0 / 5.0) {
// This is in the right most quadrant
// I implement code here to perform a "next page" action
} else if ((location.x > bounds.size.width / 3.0) && (location.x < bounds.size.width * 2.0 / 3.0)) {
// This is in the middle third
BOOL hidden = [self.navigationController isNavigationBarHidden];
// resize the height of self.webView1, self.webView2, and self.webView3 based on the toolbar hiding / showing
CGRect webViewControllerFrame = self.webView.frame;
webViewControllerFrame.size.height += (hidden ? -44 : 44);
self.webView.frame = webViewControllerFrame;
// I hide all of the upper status bar and navigation bar, and bottom toolbar for a clean reading screen
[[UIApplication sharedApplication] setStatusBarHidden:!hidden];
[self.navigationController setNavigationBarHidden:!hidden animated:YES];
self.toolbar.hidden = !hidden;
// I perform content relayout here in the now modified webView screen real estate
}
}
Эта базовая структура подтолкнула меня к работе и, надеюсь, ответит на ваш вопрос или, по крайней мере, покажет, что вы правынаправление.
Примечания:
Я еще не рассматривал тот факт, что я могу интерпретировать нажатие как "показать / скрыть статус / навигацию / панели инструментов", и UIWebView может действовать на это женажмите как ссылку и т. д. Я планируюкратко рассмотрим ...
Прозрачность, которую вы показываете на скриншоте Stanza, не имеет большого значения.Для этого вам придется поиграть с настройками альфа-канала на различных панелях навигации / панели инструментов, а также изменить код изменения размеров в UIWebView выше.Фактически я периодически накладываю на дополнительную полупрозрачную панель инструментов для временного состояния, предупреждений и т. Д. И не изменяю размер UIWebView, чтобы он находился снизу и оставался видимым через эту панель инструментов предупреждений.