Подтвердить что ты не робот

UICollectionView исчезает

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

В настоящее время у меня есть приложение, которое использует два UICollectionViews внутри a 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

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

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

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

4b9b3361

Ответ 1

Итак, что работало?

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

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

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

self.scrollDirection = UICollectionViewScrollDirectionHorizontal;

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

в моем наблюдателе, чтобы ответить на 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;
}

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

Ответ 7

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

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