我需要实现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,直到他们计算出尺寸以适合他们的内容。
有没有办法实现这个目标?
答案 0 :(得分:0)
您可以尝试使用webViewDidFinishLoad中的相应webView:
CGRect frame = webView.frame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
webView.frame = frame;
这会调整webView的大小以适应其内容。然后计算新布局并调用invalidateLayout以使用新布局。
答案 1 :(得分:0)
我被困在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,这将证明是昂贵的