UICollectionView клетки исчезают


что происходит

в настоящее время у меня есть приложение, которое использует два UICollectionViews внутри UITableView. Таким образом, я создаю пульс Новости выглядят как приложение. Моя проблема с этим заключается в том, что иногда 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];

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

8 51

8 ответов:

Итак, что же работать?

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

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

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

self.scrollDirection = UICollectionViewScrollDirectionHorizontal;

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

4) The важной частью:

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

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

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

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

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

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

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

в моем случае (вертикальная прокрутка, с ячейками, исчезающими в первом представлении) ячейки исчезали из-за неправильного расчетного размера. Кажется,UICollectionView использует расчетный размер для расчета элементов для загрузки в первом представлении. Я установил слишком высокий расчетный размер, что привело к неправильным вычислениям количества элементов для загрузки на первом экране.

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

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

в моем наблюдателе, чтобы ответить на 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, но я надеюсь, что это поможет кому-то еще.

Я думаю, что это не ошибка UICollectionView, возможно, вы не возвращаете правильные данные в - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect метод.

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

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