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];
Все тот же грустный результат.
Ответы
Ответ 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.