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 ответов:
Итак, что же работать?
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 вызовет такое поведение, но удаление их исправило проблема. Это может не быть причиной вашей проблемы, но это может быть полезно для разработчиков, ищущих аналогичные симптомы.