Работаем с UIWebView

В статье описано основные моменты при работы с элементом управления UIWebView, а также некоторые tips, с которыми пришлось столкнуться в процессе работы.

UIWebView позволяет добавить веб-браузер в свое приложение. По своей сути это будет Safari (правда немного модифицированный в учетом специфики iPhone).

Делегат

Если вы используете UIWEbView и хотите влиять на процес загрузки, отображения информации, то вам необходимо реализовать протокол UIWebViewDelegate.

Например:

@interface YourViewController : UIViewController<UIWebViewDelegate>

И в коде:

[webView setDelegate:self];


Добавить UIWebView программно

Лучше это делать в loadView:

- (void)loadView {
	self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
	
	// Init UIWebView
	CGRect rect = CGRectMake(wTop, wLeft, wWidth, wHeight);
	webView = [[UIWebView alloc] initWithFrame: rect];
	[webView setDelegate:self];
	[webView loadHTMLString:yourHTMLString baseURL:nil];
	[webView setScalesPageToFit:NO];
	[webView setUserInteractionEnabled:YES];
	webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
	self.view.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
	[self.view addSubview:webView];
}


Как определить, что данные загружены

Загрузить данные можно с помощью функций:

– loadData:MIMEType:textEncodingName:baseURL:
– loadHTMLString:baseURL:
– loadRequest:

Например:

[webView loadHTMLString:yourHtmlString baseURL:nil];


Для определения, что данные загружены, необходимо добавить следующий код:

- (void)webViewDidFinishLoad:(UIWebView *)web{
    NSLog(@"Loaded!");
}


Как сделать, чтобы ссылки внутри UIWebView были кликабельными

Во первых, нужно установить в true свойство setUserInteractionEnabled вашего UIWebView:

[webView setUserInteractionEnabled:YES];

Во вторых, реализовать метод shouldStartLoadWithRequest:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
	if (navigationType == UIWebViewNavigationTypeLinkClicked) {
		[[UIApplication sharedApplication] openURL:[request URL]];
		return NO;
	}
	
	return YES;
}


Теперь по клике на ссылку приложение закроется и откроется Safari. Чтобы запретить отрывание ссылок достаточно вернуть NO.

Как выполнить JavaScript код?

При первом вызове его можно включить в текст HTML строки, но если вам надо исполнить код после загрузки, используйте метод:

[webView stringByEvaluatingJavaScriptFromString:script];


Изменение orientation устройства

Для того, чтобы ваш UIWebView корректно перерисовывался при поворотах, необходимо свойство autoresizingMask установить таким образом:

webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);


При повороте появилась одна проблема, для решения которой пришлось потратить много времени, а именно установленный шрифт при повороте увеличивался. Эта проблема обсуждается здесь, и как ни странно, но первых два ответа не помогли.

Решение следующее — необходимо сделать reload и заново установить желаемый размер шрифта:

[webView reload];


Вызывать данный код необходимо в методе:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation


Это создает некоторое «дергание», но решает проблему. Если же самовольное изменение размера шрифта для вас является не критичным, то reload можно не делать.

Если у вас есть другие решения, можете поделиться.

Как узнать высоту UIWebView включая область скроллинга?

Для этого необходимо выполнить код:

int position = [[webView stringByEvaluatingJavaScriptFromString:@«window.pageYOffset»] intValue]

Как узнать высоту проскроленной области?

Для этого необходимо выполнить код:

int position = [[webView stringByEvaluatingJavaScriptFromString:@«scrollY»] intValue]

Использование Viewport

Viewport позволяет управлять масштабированием вашего веб-контента, задавать видимые области и т.д. Более детально с примерами читаем здесь.

Скроллинг к указанной позиции

Необходимо использовать JavaScript функцию scrollTo:

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"window.scrollTo(0, %i);", lastPosition)]];


Last Viewed Page. Как?

Главная задача — сохранить последнюю позицию (scrollY) и при окончании загрузки выполнить scrollTo. Все отлично работает до того момента, пока вы захотите, чтобы это работало при поворотах.

Пересчет координаты типа currentPosition * 480 / 320 не поможет, так как при повороте размер занимаемой текстом области может меняться. Я получил оптимальный коэффициент при поворотах около 1.43.

Пересчет координат необходимо делать до того, как произойдет поворот, лучше всего в функции willRotateToInterfaceOrientation:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

Это поможет вам избежать ошибки пересчета в некоторых случаях.

Эти советы действительны при

[webView setScalesPageToFit:NO];

В противном случае ваш UIWebView будет пытаться втиснуть весь контент в отведенную для него область. Досконально разобраться в логике масштабирования и вписывания пока не удалось.

Как вернуться назад

Для этого есть метод goBack:

[webView goBack];


Как получить HTML и текст нашего UIWebView

Для этого необходимо воспользоваться JavaScript:

NSString *str = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
NSLog(@"%@",str);


NSString *str = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.textContent"];
NSLog(@"%@",str);

Это основные моменты при работе с UIWEbView, если что-то забыл — можете дополнить.
  • 0
  • 1 декабря 2009, 19:41
  • admin

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.