Ячейка UICollectionView исчезает

Какие'происходит

В настоящее время у меня есть приложение, которое использует дваUICollectionViews внутриUITableView, Таким образом, я создаю приложение Pulse News, похожее на приложение. Моя проблема с этим заключается в том, что иногда 6-й и 11-й ряд полностью исчезают, оставляя пустое место, где должна быть клетка. Я бы нена самом деле не возражаю, если бы все клетки были такими (и таким образом я мог предположить, что я нея делаю все правильно), но дело в том, что происходит именно с этими конкретными.

Моя теория

6-я и 11-я строки - это те, которые появляются, когда я начинаю прокручивать, поэтому по умолчанию я вижу 5 ячеек, и когда я делаю первую горизонтальную прокрутку, появляется 6-я (иногда пустое место).

Что я имею

Единственное, что я сейчас делаю, это:

 [self.collectionView registerNib:[UINib nibWithNibName:CELL_NIB_NAME bundle:nil] forCellWithReuseIdentifier:CELL_IDENTIFIER];

НаviewDidLoad, И о создании ячейки:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CELL_IDENTIFIER forIndexPath:indexPath];

    NSMutableDictionary *dictionary = [self.DataSource objectAtIndex:[indexPath row]];

    [cell buildViewWithDictionary:dictionary withReferenceParent:self.referenceViewController];

    return cell;
}

Так что, по моему пониманию, здесь ничего особенного не происходит. Я думал, что что-то не так с источником данных (фиктивный файл JSON), но иногда он работает нормально, и ячейка показывает, так что я думаю, что с этой стороны все в порядке.

Так что мой "вопрос"Кто-нибудь знает что?происходит? Я нене очень хочется говорить, что этоошибка в iOS, но я могуне думать ни о чем другом.

Изменить 1.0

Удивительная часть в том, что этот метод

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;

Собирается изindexPath [0,4] - [0,6] без расчета [0,5]. Я впервые вижу, что это происходит в iOS.

Редактировать 2.0

Я изменил способ создания ячеек, и вместо удаления я использую старый способ:

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CELL_NIB_NAME owner:self options:nil];
MyCell *cell = (MyCell *)[nib objectAtIndex:0];

Все тот же печальный результат.

 Rui Peres27 февр. 2013 г., 20:58
Странные вещи происходят. = / Но все же выдающийся контроллер ..
 Mark Ingram27 февр. 2013 г., 20:45
У меня та же проблема, но исчезающие клетки оказываются ниже предыдущей! Очень странно. Я'Мы предположили, что это ошибка в iOS.
 Peter Stajger23 мая 2013 г., 17:31
У меня есть классический вид сетки, созданный с использованием представления коллекции. У меня 3 клетки подряд с небольшими пробелами. То же самое происходит и здесь, но выглядит очень случайно. Время от времени одна клетка размещается на 4-м месте подряд и в ней 'Ожидаемое место - ничто.

Ответы на вопрос(9)

иде) ячейки исчезали из-за неправильного оценочного размера. Похоже на то,UICollectionView использует приблизительный размер для расчета элементов, загружаемых в первом представлении. Я'd установите слишком большой расчетный размер, что приведет к неправильным вычислениям количества элементов, загружаемых на первом экране.

В тот момент, когда я немного уменьшил предполагаемую высоту, все клетки появились правильно.

что эта проблема связана с тем, как я настраиваю коллекцию для открытой клавиатуры, чтобы предотвратить наложение контента.

в моем наблюдателе, чтобы ответить на KeyboardWillShow у меня было это:

var userInfo = obj.UserInfo[UIKeyboard.FrameEndUserInfoKey];
if (userInfo is NSValue value)
{
    var rect = value.CGRectValue;
    var windowOffset = this.Superview.ConvertPointToView(this.Frame.Location, UIApplication.SharedApplication.KeyWindow);
    var newHeight = rect.Y - windowOffset.Y;

    this._controller.CollectionView.Frame = new CGRect(0, 0, this._controller.CollectionView.Frame.Width, newHeight);
}

После изменения этого на это:

var userInfo = obj.UserInfo[UIKeyboard.FrameBeginUserInfoKey];
if (userInfo is NSValue value)
{
    var rect = value.CGRectValue;
    UIEdgeInsets contentInsets = new UIEdgeInsets(0, 0, rect.Height, 0);
    this._controller.CollectionView.ContentInset = contentInsets;
    this._controller.CollectionView.ScrollIndicatorInsets = contentInsets;
}

Проблема исчезновения клеток полностью исчезла. Это C # от работы с xamarin, но я надеюсь, что это поможет кому-то еще.

предложенных кем-либо, не помогло мне в моей пользовательской компоновке, которую мы должны иметь в нашем приложении. Вместо этого я должен был сделать это: (И да,ОНО РАБОТАЕТ!!!)

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{
    CGSize size = [self collectionViewContentSize];
    rect.size.height = size.height*2;
    NSArray *atrributes_Super = [super layoutAttributesForElementsInRect:rect];
    return atrributes_Super;
}

В конце концов, UICollectionView просто ищет атрибуты для элементов, которые будут отображаться на вашем экране »прямоугольник

 jcardenete09 мая 2016 г., 14:50
Подобная вещь произошла здесь. Моя реализация layoutAttributesForElementsInRect не возвращала атрибуты для нужной ячейки, которые, в свою очередь, устанавливались как .hidden = YES.

что это не UICollectionView ‘Возможно, вы не вернете правильные данные в- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect метод.

Вы можете увидеть это демо:https://github.com/lqcjdx/YLTagsChooser все ячейки могут появляться при скроллинге UICollectionView.

что вместо того, чтобы пропуститьскрытый» Ячейки мы случайно вставили ячейки размером 0х0. Получающееся поведение было очень запутанным и не предполагало, что эти невидимые клетки были проблемой. Мы увидели бы ячейки правильного размера и расположение, но некоторые из действительных ячеек постоянно исчезали бы после прокрутки на экране. Я понятия не имею, почему смешивание ячеек 0 размера может вызвать такое поведение, но удаление их решило проблему. Это может не вызывать вашу проблему, но это может быть полезно разработчикам, ищущим похожие симптомы.

но после загрузки изображений я заменил код[self.myCollectionView reloadData] с[self.myCollectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; чтобы обновить вид коллекции и он показывает все ячейки, вы можете попробовать это.

 Grease19 апр. 2018 г., 10:59
Можно'Не думаю, что это действительно сработало, и это добавило анимации и для меня.
 Shannon Potter18 апр. 2017 г., 23:41
Тупо, это сработало и для меня ... чтопродолжается?UICollectionView
 Itachi Uchiha03 нояб. 2017 г., 13:56
Круто, это работает
 Antoine21 мая 2017 г., 10:27
Пробовал другие решения выше, ни одно не работало (Swift 3), это исправило ошибку. Странный...
 Jacky Wang25 нояб. 2015 г., 07:19
Вау, это действительно сработало ...

что если ширина и интервалы вставок и ячеек сечения в точности совпадают с шириной экрана, то первый столбец иногда случайно исчезает и в некоторых местах снова появляется для некоторых ячеек. Вместо того, чтобы создавать подклассы или изменять ширину ячеек, я изменил вставки разделов для левого и правого в моей раскадровке с 6 на 4, и это у меня нетЯ снова видел проблему.

 Rui Peres16 янв. 2013 г., 08:33
Я не былне могу исправить это с помощью Робас решением. Но я очень рад, что это сработало для тебя, чувак.

рое время на выяснение одной из возможных причин исчезновения ячейки во время прокрутки, я также добавлю свой ответ.

Предпосылки проблемы:У тебя естьUICollectionView примерУ тебя естьUICollectionViewFlowLayoutSubclassЭта проблема

Клетки исчезают из представления коллекции после прокрутки до определенной точки.

Источник проблемы в неправильном подклассе.UICollectionViewFlowLayout

Как прямо сказано вдокументация:

Каждый объект макета должен реализовывать следующие методы:

- collectionViewContentSize
- layoutAttributesForElements(in:)
- layoutAttributesForItem(at:)
- layoutAttributesForSupplementaryView(ofKind:at:) // (if your layout supports -supplementary views)
-layoutAttributesForDecorationView(ofKind:at:) // (if your layout supports decoration views)
- shouldInvalidateLayout(forBoundsChange:)

Полагаясь наUICollectionViewFlowLayout При реализации вышеуказанных методов мы упускаем тот факт, чтоfunc layoutAttributesForElements(in rect: CGRect) а такжеcollectionViewContentSize будет генерировать неправильноcontentSize (размер, который был бы правильным, если бы все клетки имелиitemSize Размер и размер контента будут соответствовать. Как только прокрутитеoffsetY будет больше, чемcontentSize Высота ячейки все исчезнет.

Решение

Решение в правильномUICollectionViewFlowLayout подклассы. Переопределите все методы, которыетребуется переопределить и все будет работать нормально.

Решение Вопроса

1) Подкласс.UICollectionViewFlowLayout

2) Установите flowLayout моегоUICollectionView в мой новый подкласс.

3) О методе инициализацииUICollectionViewFlowLayout подкласс, установите желаемую ориентацию:

self.scrollDirection = UICollectionViewScrollDirectionHorizontal;

В моем случае это горизонтальный.

4)важная часть:

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
   return YES;
}

В этот момент я должен немного теоретизировать, но, честно говоря, я неПонятия не имею.

 Michael Luton08 янв. 2013 г., 00:17
Спасибо @ rob-mayoff! У меня была такая же проблема. Всегда случайные элементы в первом столбце исчезают после прокрутки вниз, а затем снова вверх. Используя один из подклассов вopenradar.appspot.com/12433891 исправил это для меня.
 Rui Peres13 нояб. 2012 г., 22:48
Я должен быть честным Робом, странные вещи случаются при использованииUICollectionViewне уверен, чтосвязаны или нет.
 Rui Peres30 нояб. 2012 г., 14:20
@BryanLuby после того, как я сделал вshouldInvalidateLayoutForBoundsChange:Это'работает отлично.
 rob mayoff13 нояб. 2012 г., 22:42
Посмотрите на эту ошибку:openradar.appspot.com/12433891 Может ли это быть тем, что тывстречаешь?
 Bryan Luby30 нояб. 2012 г., 14:19
Вы пробовали возиться с шириной и высотой клетки? Я'У меня та же проблема рендеринга с горизонтальной прокруткой представления коллекции. Я получаю исчезающие ячейки, когда моя ширина ячейки равна 70, а высота равна 70. Если я сохраню ширину ячейки на 70 и изменю высоту ячейки на 69, она будет отображаться правильно. Я могу воспроизвести эту ситуацию каждый раз.
 xaphod05 февр. 2018 г., 18:13
Это решило мою аварию вlayoutSubViews это происходит только в iOS 9 (iOS 10 и 11 в порядке), спасибо.
 Mark Ingram28 февр. 2013 г., 10:25
К сожалению это нене работает для меня, но решение здесь -> stackoverflow.com/questions/12927027/... Если вы выводите ректы в этой функции, вы 'Вы увидите, что он создает две строки / столбца, поэтому вам нужно отфильтровать его до 1.

Ваш ответ на вопрос