Масштабирование на UIWebView - PullRequest
9 голосов
/ 21 ноября 2011

У меня есть UIWebView, который я использую для отображения различного контента, иногда HTML, а иногда PDF / Powerpoint / и т. Д. (Который, похоже, обрабатывается одним и тем же базовым элементом управления).

ЧтоЯ хочу сделать это использовать базовый UIScrollView (подпредставление UIWebView), чтобы захватить точную перспективу вида прокрутки и воссоздать позицию прокрутки в другом UIWebView, таким образом поддерживая их оба в синхронизации.

Проблема, с которой я сталкиваюсь, заключается в том, что свойство zoomScale UIScrollView всегда равно 1.0 при отображении содержимого HTML (хотя при отображении содержимого PDF zoomScale является правильным).

Мне удалось обнаружить, что единственное место, где я могу получить хоть какое-то представление о масштабе увеличения HTML-страницы, - это метод делегата scrollViewDidEndZooming:withView:atScale:.Я обнаружил, что аргумент atScale:, по-видимому, обеспечивает масштаб масштабирования относительно , который был до масштабирования до начала операции масштабирования.Так, например, при увеличении этот аргумент равен> 1, а при уменьшении он равен <1, и он представляется относительным значением между двумя масштабами масштабирования, а не абсолютным масштабом масштабирования). </p>

ЧтоЯ также обнаружил, что по сути, контент HTML и PDF обрабатывается двумя различными базовыми представлениями: есть UIWebBrowserView, который обрабатывает контент HTML, и UIWebPDFView для обработки отображения PDF.

Другими словамипри использовании UIWebPDFView свойство zoomScale UIScrollView является полностью надежным (например, 1.0 для уменьшения, 2.4 для увеличения, например).С другой стороны, UIWebBrowserView намного сложнее, и при запросе UIScrollView о zoomScale всегда возвращает 1.0, но при получении обратного вызова делегата получает значение масштаба, которое является относительным значением.

Итак, мои вопросы: -

  1. Это ошибка?(Это поведение видно на iOS 4 и 5 из того, что я видел).

  2. Как я могу получить оба zoomScale (или некоторые другие свойства / свойства) для обоихHTML и PDF контент, и получите его таким образом, чтобы состояние можно было дублировать и синхронизировать с другим UIWebView.

Я не обязан использовать zoomScaleпоэтому я открыт для других предложений о том, как состояние прокрутки UIWebView может быть записано и воспроизведено на другом UIWebView.

Ответы [ 6 ]

6 голосов
/ 29 ноября 2011

При загрузке HTML и UIWebBrowserView используется, вы можете использовать

zoomScale = 1.0 / webView.scrollView.minimumZoomScale

Конечно, это предполагает, что вы можете надежно гарантировать, что минимальный масштаб вашей HTML-страницы равен 1,0, поскольку некоторые страницы могут изменять минимальный масштаб с помощью мета-тега "viewport".

6 голосов
/ 21 ноября 2011

Вы пробовали это?

set scalesPageToFit=YES;

Это наиболее распространенный способ решения проблемы, я думаю.Настройка, которая позволяет вам сжимать и масштабировать UIWebView. Я не думаю, что вы действительно можете увеличивать / уменьшать UIWebView без этого.

Теперь масштабирование будет относительно того, что вы показываете в UIWebView.Если это большой стол, он не так близко, но это хорошая отправная точка, если вы собираетесь ущипнуть для увеличения.

4 голосов
/ 03 июня 2014

Эта логика для масштабирования UIWebView, нет необходимости добавлять UIWebView на UIScrollView

Ну, единственная проблема с webView.scalesPageToFit=YES; заключается в том, что она изменяет размер шрифта исходного содержимогоно у меня есть другой вариант, он работает очень хорошо для меня.

Добавить <UIWebViewDelegate, UIScrollViewDelegate> в ваш файл .h

Создание вашего UIWebView.

self.mWebview = [[UIWebView alloc] init];
self.mWebview.delegate = self; /// set delegate method of UIWebView
self.mWebview.frame = CGRectMake(0, 35, self.view.bounds.size.width, self.view.bounds.size.height - 80); // set frame whatever you want..
[self.mWebview setOpaque:NO];
self.mWebview.backgroundColor = [UIColor clearColor];
[self.view addSubview:self.mWebview];

С загрузкой HTML-файла / содержимого.

NSString* htmlString = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"File Name"ofType:@"html"] encoding:NSUTF8StringEncoding error:nil];
[self.mWebview loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];


#pragma mark -
#pragma mark - Webview Delegate Methods

- (void) webViewDidFinishLoad:(UIWebView *)webView
{
    webView.scrollView.delegate = self; // set delegate method of UISrollView
    webView.scrollView.maximumZoomScale = 20; // set as you want.
    webView.scrollView.minimumZoomScale = 1; // set as you want.

    //// Below two line is for iOS 6, If your app only supported iOS 7 then no need to write this.
    webView.scrollView.zoomScale = 2;
    webView.scrollView.zoomScale = 1;
}

#pragma mark -
#pragma mark - UIScrollView Delegate Methods

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
    self.mWebview.scrollView.maximumZoomScale = 20; // set similar to previous.
}

ПРИМЕЧАНИЕ: Мне пришлось протестировать на Mac OS X - 10.9.3 с Xcode5.1.1 и iOS версии 6.1 и выше.

Надеюсь, это поможет вам.:)

2 голосов
/ 29 августа 2012

К сожалению, единственный способ найти действительный масштаб веб-контента в UIWebView - это доступ к закрытому члену UIWebBrowserView: initialScale.

float initialScale = (access to [UIWebBrowserView initialScale])
float zoomScale = 1.0 / webView.scrollView.minimumZoomScale;
float actualScale = zoomScale * initialScale;

Мне интересно, можно ли это сделать без доступа к приватному члену.

1 голос
/ 26 декабря 2013

просто установите,

scalesPageToFit=YES для увеличения Pich на UIWebView

1 голос
/ 19 декабря 2012

Это может быть немного поздно, но для тех, кому нужно определить, содержит ли текущий UIWebView HTML.Метод, который я написал, чтобы определить это, был ниже.Я назвал это сразу после того, как webView загрузил

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (!webViewIsHTMLHasBeenSet) {
        webViewIsHTML = [self containsWebBrowserView];
        NSLog(@"webViewIsHTML = %@",webViewIsHTML ? @"YES": @"NO");
    }
}

- (BOOL)containsWebBrowserView {
    BOOL result = NO;
    for (UIView * WVSubview in [webView.scrollView subviews]) {
        if ([NSStringFromClass([WVSubview class]) isEqualToString:@"UIWebBrowserView"]) {
            result = YES;
            webViewIsHTMLHasBeenSet = YES;
            return result;
        }
    }
    webViewIsHTMLHasBeenSet = YES;
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...