gpt4 book ai didi

ios - 流布局不支持负尺寸或零尺寸

转载 作者:技术小花猫 更新时间:2023-10-29 10:17:54 25 4
gpt4 key购买 nike

我有一个相当复杂的 collectionView 单元格,我注意到如果我在 collectionView 上滚动得非常快,它会使应用程序崩溃。

我得到的错误之一是:

negative or zero sizes are not supported in the flow layout

我注意到我是否只返回一个浮点值,例如500,在我的 UICollectionView sizeForItemAtIndexPath: 方法中,它没有崩溃。

我的 Collection View 具有动态单元格高度。

我正在使用此库在我的 sizeForItemAtIndexPath: 方法中解析 HTML 属性字符串:

https://github.com/mmislam101/HTMLAttributedString

有谁知道是什么原因导致出现上述错误消息?

更新

我在 Bugsense 报告中看到的与此崩溃相关的另一个错误是:

-[__NSArrayM objectAtIndex:]: 索引 2 超出范围 [0 .. 1]

当我滚动得太快时会发生这种情况 =/

更新2

Bugsense 堆栈跟踪显示崩溃顺序方法调用是:

1) collectionView:layout:sizeForItemAtIndexPath:

2) calculateFeedCellHeightForIndexPath: (这是我自己的方法之一,不是Apple的)

3) dynamicHeightForHTMLAttributedString:UsingWidth:AndFont: (这是我自己的方法之一,不是苹果的)

4) HTMLAttributedString attributedStringWithHtml:andBodyFont: 第 35 行

5) HTMLAttributedString attributedString 第 79 行

6) scrollViewDidScroll: 第 174 行

7) setFeedFooterHeight:animated: 第 124 行

我的 setFeedFooterHeight:animated: 方法是:

-(void)setFeedFooterHeight:(CGFloat)newHeight animated:(BOOL)animated
{
footerHeightConstraint.constant = newHeight;

if(animated)
{
[UIView animateWithDuration:0.35 animations:^{
[self layoutIfNeeded]; // <------ crash on this line it seems
}];
}
else
{
[self.feedFooterView layoutIfNeeded];
}
}

但是,当我直接从 Xcode 而不是上面的 Testflight 运行应用程序时,Xcode 在上面的第 5 步停止,这会产生这段代码:

- (NSAttributedString *)attributedString
{
__block NSString *css = @"<style>";

[_cssAttributes enumerateObjectsUsingBlock:^(NSString *cssAttribute, NSUInteger idx, BOOL *stop) {
css = [css stringByAppendingString:cssAttribute];
}];

css = [css stringByAppendingString:@"</style>"];
NSString *htmlBody = [_html stringByAppendingString:css];

NSStringEncoding encoding = NSUnicodeStringEncoding;
NSData *data = [htmlBody dataUsingEncoding:encoding];

NSDictionary *options = @{NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute : @(encoding)};

// app crashes here on this next line.
NSAttributedString *body = [[NSAttributedString alloc] initWithData:data
options:options
documentAttributes:nil
error:nil];

return body;
}

我在其他线程上读到一些关于包装 uicollectionview 重新加载直到 uicollection.isTracking 变为 false 的内容?

我试过了,但似乎没有帮助。

更新3

好吧,我无意中发现了那个错误的原因。

它与 [collectionView.collectionFlowLayout invalidateLayout]; 调用有关。

我添加了 1.0 秒的延迟,问题似乎消失了。

最佳答案

我认为这是与 UICollectionView 的委托(delegate)/数据源方法和/或 NSAttributedString 相关的 iOS 8 错误。

我可以通过在 sizeForItemAtIndexPath: 中从 HTML 创建一个 NSAttributedString 在一个项目中得到同样的崩溃如果我创建一个属性字符串 first numberOfRows: 这会阻止崩溃:很可能的问题是 UIKit 中的某些东西没有被正确初始化,或者在 HTML 解析器和 UICollectionView 大小调整方法之一之间共享缓冲区.

注意:在 iOS 7.1 上我得到一个不同的异常:“UICollectionView 收到了一个单元格的布局属性,该单元格的索引路径不存在:”


试试这个实验:调用类似的东西:

NSData *data = [@"<a href=\"http://www.google.com\">link</a>" dataUsingEncoding:NSUnicodeStringEncoding];
NSAttributedString *s = [[NSAttributedString alloc] initWithData:data options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType} documentAttributes:nil error:nil];

在,说:

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

这似乎迫使某些东西(也许是解析器?)被初始化,这样当我随后在以下代码中使用类似的代码时:

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

它不会崩溃。疯狂小镇。

我将下载 8.1 beta 2 并在那里进行测试,然后再报告。

关于ios - 流布局不支持负尺寸或零尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26249472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com