iPhone — Автоматическое изменение размера содержимого UIWebView не помещается в рамку

#ios #iphone #uiwebview #frame #autoresize

#iOS #iPhone #uiwebview #фрейм #автоматическое изменение размера

Вопрос:

Я создаю UIWebView в своем методе viewDidLoad с крошечным размером (скажем, что-то вроде 50×70). А затем я поместил его в super UIView.

Я бы хотел, чтобы его содержимое соответствовало фрейму WebView. Для этого я написал :

         oneView = [[UIWebView alloc] initWithFrame:CGRectMake(x, y, W, H)];
        oneView.backgroundColor = [UIColor whiteColor];
        oneView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        oneView.scalesPageToFit = YES;
        oneView.autoresizesSubviews = YES;

        [self.view addSubview:oneView];
        [oneView loadRequest:/*some request*/];
  

Но при этом размер веб-страницы не изменяется в соответствии с фреймом UIWebView.
Кажется, что оно масштабируется до чего-то другого, меньшего, чем фрейм супервизора, и более широкого, чем фрейм webview.

введите описание изображения здесь

Если я установлю размер фрейма webview равным размеру всего супервизора, все в порядке.
Как я могу заставить веб-контент (реальный контент www) соответствовать фрейму «уменьшенного» UIWebView?

Комментарии:

1. Можете ли вы заменить строку loadRequest на строку addSubview? Можете ли вы опубликовать скриншот? Хорошо ли выглядит размер, если вы изначально установили фрейм webview на фрейм superview?

Ответ №1:

Ответ таков: вы уже делаете это, но есть ограничения.

Посмотрите на следующие скриншоты:

Снимок экрана 1, масштаб страницы соответствует ДА и НЕТ

Оба webview имеют одинаковую ширину. В нижней части страница помещается идеально.

введите описание изображения здесь

Снимок экрана 2, масштаб страницы соответствует обоим, ДА, но установлена меньшая ширина

Оба webview пытаются уместить страницу, но это не получится, поскольку существует ограничение по размеру.

введите описание изображения здесь

Комментарии:

1. Возможно ли сделать снимок содержимого, графически изменить его размер, а затем отобразить?

2. Да, вы можете, это довольно просто: посмотрите, как получить UIImage из снимка экрана UIWebView

Ответ №2:

Попробуйте это.У меня это работает.

 NSString *strTemplateHTML = [NSString stringWithFormat:@"<html><head><style>img{max-width:100%%;height:auto !important;width:auto !important;};</style></head><body style='margin:0; padding:0;'>%@</body></html>", @"insert your html content here"];

[webView loadHTMLString:strTemplateHTML baseURL:nil];
  

Ответ №3:

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

 self.webView.scrollView.scrollEnabled = NO;
  

и добавьте отдельный, scrollView который будет обрабатывать прокрутку и масштабирование вместо webView собственной прокрутки.
Следующая реализация

 - (void) webViewDidFinishLoad:(UIWebView *)webView
{
   CGRect frame = _webView.frame;
   CGSize fittingSize = [_webView sizeThatFits:_webView.scrollView.contentSize];
   frame.size = fittingSize;
   _webView.frame = frame;
   self.scrollView.contentSize = self.webView.scrollView.contentSize;
}
  

чтобы установить правильный webView фрейм.
Надеюсь, это кому-то поможет. Хорошее кодирование!

Ответ №4:

Используйте sizethatfits() в webview, что решило бы вашу проблему.

Ответ №5:

Вы можете сделать следующее:

 oneview.contentMode = UIViewContentModeScaleAspectFit;
  

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

Для этого свойства есть другие параметры, и вы найдете довольно хорошее объяснение более сложных из них, наряду с изображениями, показывающими эффект каждого, в руководстве по программированию View для iOS

Обратите внимание, что установленная вами маска автоматического изменения размера приведет к увеличению размера самого представления только при увеличении размера его супервизора. Если self.view уже большой, когда создается маленький UIWebView, а self.view не увеличивается, UIWebView не будет увеличиваться. Вы, вероятно, знаете об этом, но я добавляю это на всякий случай, поскольку мы не можем видеть фрейм self.view в этом фрагменте кода.

Надеюсь, это полезно.

Комментарии:

1. что за фрейм в self.view?

2. Обратите внимание, что также существует свойство UIWebView, которое вы могли бы установить следующим образом: OneView.scalesPageToFit = YES

3. lol, извините, пропустил это. Возможно, я неправильно истолковал ваш вопрос, подумал, что ваша проблема связана с изменением размера веб-представления.

Ответ №6:

Для Swift 2.2 я добился того же с

 //Document file url
var docUrl = NSURL(string: "https://www.google.co.in/url?sa=tamp;rct=jamp;q=amp;esrc=samp;source=webamp;cd=1amp;ved=0ahUKEwjjwPSnoKfNAhXFRo8KHf6ACGYQFggbMAAamp;url=http://www.snee.com/xml/xslt/sample.docamp;usg=AFQjCNGG4FxPqcT8RXiIRHcLTu0yYDErdQamp;sig2=ejeAlBgIZG5B6W-tS1VrQAamp;bvm=bv.124272578,d.c2Iamp;cad=rja")

let req = NSURLRequest(URL: docUrl!)
webView.delegate = self
//here is the sole part
webView.scalesPageToFit = true
webView.contentMode = .ScaleAspectFit
webView.loadRequest(req)
  

Ответ №7:

Для Swift 3 я добился того же с

 DispatchQueue.main.async {
                if let finalURL = URL(string: urlString) {
                    let request = URLRequest(url: finalURL)

                    // self.webView.sizeToFit()
                    self.webView.scalesPageToFit = true
                    self.webView.contentMode = .scaleAspectFit
                    self.webView.loadRequest(request)
                }
            }