Предупреждения NSCollectionView, ссылающиеся на UICollectionViewFlowLayout
У меня есть NSOutlineView, и каждая ячейка внутри него имеет NSCollectionView (горизонтальный), настроенный с использованием автомакета с «высотой» collectionView, определяющей высоту ячейки layoutView. Каждый элемент в collectionView может иметь динамическую ширину, и я использую «фиктивный» элемент collectionView для определения размера каждого элемента из его содержимого, а затем в
outlineView:viewForTableColumn:item
метод делегата, получая высоту collectionView с помощью
collectionView.collectionViewLayout.collectionViewContentSize.height
и используя это, чтобы установить «ограничение высоты» collectionView (для управления динамической высотой ячейки).
По большей части это работает нормально, но я несколько раз получаю это предупреждение в консоли:
Поведение UICollectionViewFlowLayout не определено, потому что: ширина элемента должна быть меньше, чем ширина UICollectionView минус вставки левого и правого значений раздела, минус вставки левого и правого значений содержимого. Соответствующий экземпляр UICollectionViewFlowLayout — <NSCollectionViewFlowLayout: 0x10e3b7f80>, и он присоединен к <MacTagsCustomCollectionView:0x10e3b7840>. Установите символическую точку останова в UICollectionViewFlowLayoutBreakForInvalidSizes, чтобы перехватить это в отладчике.
Я пытался погуглить это, но не могу найти хорошего объяснения этой проблемы. Я не уверен, почему он ссылается на «UICollectionViewFlowLayout», когда это приложение AppKit и использует NSCollectionView. Кроме того, установка символической точки останова UICollectionViewFlowLayoutBreakForInvalidSizes не помогает и никогда не срабатывает.
Вот некоторый код из viewForTableColumn моего layoutView, где я получаю высоту collectionView и, следовательно, высоту ячейки:
DataCellView *result = [outlineView makeViewWithIdentifier:@"DataWithTags" owner:self];
if (result.tagListCollectionView.delegate == nil) {
result.tagListCollectionView.delegate = self;
result.tagListCollectionView.dataSource = self;
result.tagsCollectionViewScrollView.automaticallyAdjustsContentInsets = NO;
NSNib *cellNib = [[NSNib alloc] initWithNibNamed:@"MacTagsForPersonItem" bundle:nil];
[result.tagListCollectionView registerNib: cellNib forItemWithIdentifier:@"PersonTagsCollectionViewItemID"];
if (self.tagsSizingItem == nil) {
NSArray *topLevelObjects;
[cellNib instantiateWithOwner:self.tagsSizingItem topLevelObjects: &topLevelObjects];
for (id topLevelObject in topLevelObjects) {
if ([topLevelObject isKindOfClass:[MacPersonTagsCollectionViewItem class]]) {
self.tagsSizingItem = topLevelObject; // need this to determine each collectionView cell's size based on the text
break;
}
}
}
result.tagListCollectionView.backgroundColors = @[[NSColor clearColor]];
result.tagListCollectionView.enclosingScrollView.backgroundColor = [NSColor clearColor];
result.tagsCollectionViewScrollView.verticalScroller.hidden = YES;
result.tagListCollectionView.outlineView = outlineView; // so scroll in tagsCollectionView can be passing onto the outlineView instead
}
result.tagListCollectionView.tagsPerson = person;
[result.tagListCollectionView reloadData];
result.frame = outlineView.bounds; // important to do this
[result layoutSubtreeIfNeeded];
[result.tagListCollectionView layoutSubtreeIfNeeded];
if (person.tagsCacheHeight == 0) {
// use cacheHeight because when outlineView reloads after contacts syncing, it collectionView height sizing goes crazy for some reason.
person.tagsCacheHeight = result.tagListCollectionView.collectionViewLayout.collectionViewContentSize.height;
}
result.collectionViewHeightConstraint.constant = person.tagsCacheHeight;
[result.tagListCollectionView.collectionViewLayout invalidateLayout];
return result;
Я использовал ту же базовую технику с моим приложением для iOS, чтобы создать ячейки tableView с изменяемым размером collectionView внутри каждой ячейки и даже в другой части моего приложения Mac, но, похоже, это не работает для этого конкретного представления и дает это странное предупреждение. И это не просто предупреждение в моем случае, поскольку, если я попытаюсь настроить NSCollectionViewLayout (я хочу сделать их выровненными по левому краю), макет сломается и вернется к этому равномерно распределенному макету потока по умолчанию, который я не хочу . Интересно, что предупреждение исчезает, если я устанавливаю фиксированную ширину для размера элемента collectionView. Я пытался установить минимальное расстояние между элементами на 0, но это не помогает. Вставка раздела равна 0 (каждый collectionView имеет только 1 раздел).
Любые советы о том, как выяснить, что может быть причиной этой проблемы?