У меня довольно сложная ячейка collectionView, и я заметил, что если я очень быстро прокручиваю свой файл collectionView, это приведет к сбою приложения.
Одна из ошибок, которые я получил, это:
negative or zero sizes are not supported in the flow layout
Я заметил, что я просто возвращаю значение float, например. 500, в моем методе UICollectionView sizeForItemAtIndexPath:
он не сбой.
В моем представлении коллекции есть динамические высоты ячеек.
Я разбираю строку HTML Attributed в моем методе sizeForItemAtIndexPath:
, используя эту библиотеку:
https://github.com/mmislam101/HTMLAttributedString
Кто-нибудь знает, что вызывает, в частности, указанное сообщение об ошибке?
Update
Другая ошибка, которую я также вижу в моем отчете Bugsense, связанном с этим сбоем:
- [__ NSArrayM objectAtIndex:]: индекс 2 за пределами границ [0.. 1]
Это происходит, когда я прокручиваю слишком быстро =/
Обновление 2
Bugsense stacktrace показывает, что вызовы метода аварийного вызова:
1) collectionView: layout: sizeForItemAtIndexPath:
2) calculateFeedCellHeightForIndexPath: (это один из моих собственных методов, а не Apple)
3) dynamicHeightForHTMLAttributedString: UsingWidth: AndFont: (это один из моих собственных методов, а не Apple)
4) HTMLAttributedString attribittedStringWithHtml: andBodyFont: строка 35
5) HTMLAttributedString attribittedString строка 79
6) scrollViewDidScroll: строка 174
7) setFeedFooterHeight: анимированный: строка 124
Мой setFeedFooterHeight: анимированный: метод:
-(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 reload, пока uicollection.isTracking не станет ложным?
Я пробовал это, но, похоже, не помог.
Обновление 3
ОК, я случайно наткнулся на причину этой ошибки.
Это связано с вызовом [collectionView.collectionFlowLayout invalidateLayout];
.
Я добавил задержку в 1,0 секунды, и проблема, похоже, исчезла.