UICollectionView с проблемами размера UIWebView

Мне нужно реализовать UICollectionView . Ячейки, которые я использую, имеют UIWebViews внутри них. Основная проблема заключается в том, что я хочу, чтобы размер ячеек был адаптирован к фактическому содержимому внутри webView.

Я использовал следующие два метода:

 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { CollectionViewCellDefault *cell = (CollectionViewCellDefault *)[collectionView cellForItemAtIndexPath:indexPath]; NSLog(@"rect %@", NSStringFromCGRect(cell.wvDisplayValue.frame)); CGSize retval = cell.wvDisplayValue.frame.size; retval.height += 135; retval.width += 135; return retval; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ CollectionViewCellDefault *cell = [collectionView dequeueReusableCellWithReuseIdentifier:detailColumnsCell forIndexPath:indexPath]; NSURL *indexFileURL = [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html"]; [cell.wvDisplayValue loadRequest:[NSURLRequest requestWithURL:indexFileURL]]; cell.lblTitle.text = @"Description: "; cell.frame = cell.wvDisplayValue.frame; return cell; } 

Проблема, конечно же, в том, что webView знает свой размер только после его загрузки:

 - (void)webViewDidFinishLoad:(UIWebView *)webView 

Как-то можно настроить размер UICollectionViewLayout для конкретной ячейки только после того, как веб-просмотр загрузил ее содержимое?

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

Есть ли способ сделать это?

Вы можете попробовать это для соответствующего webView в webViewDidFinishLoad:

 CGRect frame = webView.frame; CGSize fittingSize = [webView sizeThatFits:CGSizeZero]; frame.size = fittingSize; webView.frame = frame; 

Это изменит размер webView, чтобы он соответствовал его содержимому. Затем вычислите новый макет и вызовите invalidateLayout, чтобы использовать новый макет.

Я был застрял в комбинации WebView и CollectionView, и вы правы, с одной стороны, в коллекции необходимо определить размер ячейки сначала, т. Е. Перед отображением самого коллекцииView, т.е.

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

где, с другой стороны, WebView может определить фактический размер, который требуется только для webViewDidFinishLoad:

КАК РЕШАТЬ ТАКИЕ ПРОБЛЕМЫ?

В моем случае у меня была только одна секция, в которой был webView, поэтому я сделал, что я вычислил размер в webViewDidFinishLoad: а затем перезагрузил этот конкретный раздел после него

 - (void)webViewDidFinishLoad:(UIWebView *)aWebView { if (!_isArticleLoaded) { CGRect frame = aWebView.frame; frame.size.height = 1; aWebView.frame = frame; CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero]; frame.size = fittingSize; aWebView.frame = frame; NSMutableIndexSet *mutableIndexSet = [[NSMutableIndexSet alloc] init]; [mutableIndexSet addIndex:2]; NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height); _height = [NSNumber numberWithFloat:fittingSize.height]; _isArticleLoaded = YES; [_collectionView reloadSections:mutableIndexSet]; } } 

Поэтому изначально в viewdidload: localVariables назначаются текущие значения:

 _isArticleLoaded = NO; _height = [NSNumber numberWithFloat:200.0]; 

и для UICollectionView у меня было следующее:

 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 2) { return CGSizeMake(self.collectionView.frame.size.width,[_height floatValue]+35); } } 

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

В вашем случае мой друг, вы не должны использовать WebView для каждой ячейки, это окажется дорогостоящим

  • UICollectionView горизонтальный пейджинг с пространством между страницами
  • Динамически изменять размер ячейки в соответствии с изображением в UICollectionView
  • UICollectionView: дополнительный вид блокирует выбор элементов
  • Управление промежутком между ячейками в UICollectionViewController
  • Как вы вертикально выравниваете UICollectionViewCells в UICollectionView?
  • UICollectionViewLayout с включенной функцией горизонтальной прокрутки и разбивки на страницы
  • Границы ячеек UICollectionView в макете потока
  • iOS 8 UICollectionViewLayout Переключение таинственного сбоя в Swift
  • Как интерполировать пользовательские свойства UICollectionViewLayoutAttributes с помощью UICollectionViewTransitionLayout
  • Размещение маржи вокруг каждого края UICollectionView
  • RFQuiltLayout и UICollectionView
  • Interesting Posts

    PhoneGap 3.3 iOS KeyboardShrinksView

    используя ту же очередь отправки в методе фоновой обработки

    Возможности, требуемые от plist, могут не функционировать Xcode 6.1

    Доля Sqlite с обменом файлами iTune в приложении iOS.

    Измените контент Push Push из Userinfo в ios

    Выйти из системы после удаления приложения – Firebase

    Недействительные права доступа iOS SDK 4.1

    Получение отклика при попытке извлечь данные из базы данных Firebase

    presentViewController: анимированный: YES вид не появится, пока пользователь не повторит

    Сохраняется ли NSUserDefaults после переноса приложения?

    PresentModalViewController с некоторым фреймом

    CloudKit: creatorUserRecordID проблемы CKRecord (или ошибка?)

    Удалить маску из невыбранных вкладок UITabBarItem Swift

    Обновления приложений и приложений, представленные в App Store, должны быть созданы с помощью Xcode 5.1.1 или более поздней версии и iOS 7 или более поздней версии SDK

    Метод uINavigationControllerDelegate's didShowViewController вызывался дважды

    Давайте будем гением компьютера.