UICollectionView 与 UIWebView 大小问题
Posted
技术标签:
【中文标题】UICollectionView 与 UIWebView 大小问题【英文标题】:UICollectionView with UIWebView size problems 【发布时间】:2013-02-25 09:39:15 【问题描述】:我需要实现一个UICollectionView
。我使用的单元格内部有UIWebViews
。主要问题是我想让单元格大小适应 webViews 中的实际内容。
我使用了以下两种方法:
- (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
只有在 webview 加载了其内容后,是否可以通过某种方式调整特定单元格的 UICollectionViewLayout
的大小?
我发现的每个示例要么具有固定大小,要么不使用 webView,这需要时间才能计算出适合其内容的大小。
有没有办法做到这一点?
【问题讨论】:
【参考方案1】:你可以在 webViewDidFinishLoad 中为各自的 webView 试试这个:
CGRect frame = webView.frame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
webView.frame = frame;
这将调整 webView 的大小以适应其内容。然后计算新的布局,调用 invalidateLayout 来使用新的布局。
【讨论】:
【参考方案2】:我被困在 WebView 和 CollectionView 组合中,你是对的,一方面,collectionview 需要先确定单元格的大小,即在显示 collectionView 本身之前,即
- (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 与 UIWebView 大小问题的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionView - UICollectionViewDelegate - 如何实现与 canEditRowAtIndexPath 等效?
UICollectionView 与 UIWebView 大小问题
UIScrollView 与 UICollectionView