void CAListView::recoveryCollectionCell() { DRect rect = this->getBounds(); rect.origin = getContentOffset(); rect.origin.y -= rect.size.height * 0.1f; rect.size.height *= 1.2f; std::map<unsigned int, CAListViewCell*>::iterator itr; for (itr = m_mpUsedListCells.begin(); itr != m_mpUsedListCells.end(); itr++) { CAListViewCell* cell = itr->second; CC_CONTINUE_IF(cell == NULL); DRect cellRect = cell->getFrame(); CC_CONTINUE_IF(rect.intersectsRect(cellRect)); m_mpFreedListCells[cell->getReuseIdentifier()].pushBack(cell); cell->removeFromSuperview(); cell->resetListViewCell(); itr->second = NULL; m_vpUsedListCells.eraseObject(cell); CAView* line = m_pUsedLines[itr->first]; CC_CONTINUE_IF(line == NULL); m_pFreedLines.pushBack(line); line->removeFromSuperview(); m_pUsedLines[itr->first] = NULL; } }
void CAAutoCollectionView::updateSectionHeaderAndFooterRects() { DRect rect = this->getBounds(); rect.origin = getContentOffset(); for (int i = 0; i < m_rCollectionViewSection.size(); i++) { CollectionViewSection& cvs = m_rCollectionViewSection[i]; CC_CONTINUE_IF(!rect.intersectsRect(cvs.rSectionRect)); CAView* header = cvs.pSectionHeaderView; CAView* footer = cvs.pSectionFooterView; float headerHeight = cvs.nSectionHeaderHeight; float footerHeight = cvs.nSectionFooterHeight; if (header && m_bAlwaysTopSectionHeader) { DPoint p1 = rect.origin; p1.y = MAX(p1.y, cvs.rSectionRect.origin.y); p1.y = MIN(p1.y, cvs.rSectionRect.origin.y + cvs.rSectionRect.size.height - headerHeight - footerHeight); header->setFrameOrigin(p1); } if (footer && m_bAlwaysBottomSectionFooter) { DPoint p2 = DPointZero; p2.y = MIN(rect.origin.y + this->getBounds().size.height - footerHeight, cvs.rSectionRect.origin.y + cvs.rSectionRect.size.height - footerHeight); p2.y = MAX(p2.y, cvs.rSectionRect.origin.y + headerHeight); footer->setFrameOrigin(p2); } } }
void CAListView::loadCell() { DRect rect = this->getBounds(); rect.origin = getContentOffset(); rect.origin.y -= rect.size.height * 0.1f; rect.origin.x -= rect.size.width * 0.1f; rect.size.width *= 1.2f; rect.size.height *= 1.2f; std::map<unsigned int, CAListViewCell*>::iterator itr; for (itr = m_mpUsedListCells.begin(); itr != m_mpUsedListCells.end(); itr++) { CC_CONTINUE_IF(itr->second != NULL); unsigned int index = itr->first; DRect cellRect = m_rIndexRects[index]; CC_CONTINUE_IF(!rect.intersectsRect(cellRect)); CAListViewCell* cell = m_pListViewDataSource->listViewCellAtIndex(this, cellRect.size, index); if (cell) { cell->m_nIndex = index; cell->updateDisplayedAlpha(this->getAlpha()); addSubview(cell); cell->setFrame(cellRect); m_mpUsedListCells[index] = cell; m_vpUsedListCells.pushBack(cell); } if (m_pSelectedListCells.count(index)) { cell->setControlState(CAControlStateSelected); } if (m_pListViewDataSource) { m_pListViewDataSource->listViewWillDisplayCellAtIndex(this, cell, index); } CAView* view = this->dequeueReusableLine(); DRect lineRect = m_rLineRects[index]; if (view == NULL) { view = CAView::createWithFrame(lineRect, m_obSeparatorColor); } m_pUsedLines[index] = view; this->insertSubview(view, 1); view->setFrame(lineRect); } }
void CACollectionView::updateSectionHeaderAndFooterRects() { DRect rect = this->getBounds(); rect.origin = getContentOffset(); std::vector<DRect>::iterator itr; for (itr = m_rSectionRects.begin(); itr != m_rSectionRects.end(); itr++) { CC_CONTINUE_IF(!rect.intersectsRect(*itr)); int i = (int)(itr - m_rSectionRects.begin()); CAView* header = NULL; CAView* footer = NULL; float headerHeight = 0; float footerHeight = 0; if (m_pSectionHeaderViews.find(i) != m_pSectionHeaderViews.end()) { header = m_pSectionHeaderViews[i]; headerHeight = m_pSectionHeaderViews[i]->getFrame().size.height; } if (m_pSectionFooterViews.find(i) != m_pSectionFooterViews.end()) { footer = m_pSectionFooterViews[i]; footerHeight = m_pSectionFooterViews[i]->getFrame().size.height; } if (header && m_bAlwaysTopSectionHeader) { DPoint p1 = rect.origin; p1.y = MAX(p1.y, itr->origin.y); p1.y = MIN(p1.y, itr->origin.y + itr->size.height - headerHeight - footerHeight); header->setFrameOrigin(p1); } if (footer && m_bAlwaysBottomSectionFooter) { DPoint p2 = DPointZero; p2.y = MIN(rect.origin.y + this->getBounds().size.height - footerHeight, itr->origin.y + itr->size.height - footerHeight); p2.y = MAX(p2.y, itr->origin.y + headerHeight); footer->setFrameOrigin(p2); } } }
void CACollectionView::loadCollectionCell() { DRect rect = this->getBounds(); rect.origin = getContentOffset(); rect.origin.y -= rect.size.height * 0.1f; rect.size.height *= 1.2f; std::map<CAIndexPath3E, CACollectionViewCell*>::iterator itr; for (itr = m_mpUsedCollectionCells.begin(); itr != m_mpUsedCollectionCells.end(); itr++) { CC_CONTINUE_IF(itr->second != NULL); CAIndexPath3E r = itr->first; DRect cellRect = m_rUsedCollectionCellRects[r]; CC_CONTINUE_IF(!rect.intersectsRect(cellRect)); CACollectionViewCell* cell = m_pCollectionViewDataSource->collectionCellAtIndex(this, cellRect.size, r.section, r.row, r.item); if (cell) { cell->m_nSection = r.section; cell->m_nRow = r.row; cell->m_nItem = r.item; cell->updateDisplayedAlpha(this->getAlpha()); this->addSubview(cell); cell->setFrame(cellRect); itr->second = cell; m_vpUsedCollectionCells.pushBack(cell); if (m_pSelectedCollectionCells.count(r)) { cell->setControlStateSelected(); } if (m_pCollectionViewDataSource) { m_pCollectionViewDataSource->collectionViewWillDisplayCellAtIndex(this, cell, r.section, r.row, r.item); } } } }
void CACollectionView::recoveryCollectionCell() { DRect rect = this->getBounds(); rect.origin = getContentOffset(); rect.origin.y -= rect.size.height * 0.1f; rect.size.height *= 1.2f; std::map<CAIndexPath3E, CACollectionViewCell*>::iterator itr; for (itr = m_mpUsedCollectionCells.begin(); itr != m_mpUsedCollectionCells.end(); itr++) { CACollectionViewCell* cell = itr->second; CC_CONTINUE_IF(cell == NULL); DRect cellRect = cell->getFrame(); CC_CONTINUE_IF(rect.intersectsRect(cellRect)); m_mpFreedCollectionCells[cell->getReuseIdentifier()].pushBack(cell); cell->removeFromSuperview(); cell->resetCollectionViewCell(); itr->second = NULL; m_vpUsedCollectionCells.eraseObject(cell); } }
void CACollectionView::reloadData() { CC_RETURN_IF(m_pCollectionViewDataSource == NULL); this->reloadViewSizeData(); this->removeAllSubviews(); DRect winRect = this->getBounds(); winRect.origin = getContentOffset(); float width = winRect.size.width; int y = 0; if (m_nCollectionHeaderHeight > 0 && m_pCollectionHeaderView) { m_pCollectionHeaderView->setDisplayRange(true); m_pCollectionHeaderView->setFrame(DRect(0, y, width, m_nCollectionHeaderHeight)); addSubview(m_pCollectionHeaderView); y += m_nCollectionHeaderHeight; } ; int begin = (int)m_rSectionRects.size(); m_rSectionRects.resize(m_rSectionRects.size() + m_nSections); for (int i = 0; i < m_nSections; i++) { unsigned int iSectionHeaderHeight = m_nSectionHeaderHeights.at(i); DRect sectionHeaderRect = DRect(0, y, width, iSectionHeaderHeight); if (iSectionHeaderHeight>0) { CAView* pSectionHeaderView = m_pCollectionViewDataSource->collectionViewSectionViewForHeaderInSection(this, sectionHeaderRect.size, i); if (pSectionHeaderView != NULL) { pSectionHeaderView->setDisplayRange(true); pSectionHeaderView->setFrame(sectionHeaderRect); insertSubview(pSectionHeaderView, 1); m_pSectionHeaderViews[i] = pSectionHeaderView; y += iSectionHeaderHeight; } } y += m_nVertInterval; unsigned int rowCount = m_nRowsInSections.at(i); for (int j = 0; j < rowCount; j++) { int iHeight = m_nRowHeightss.at(i).at(j); unsigned int itemCount = m_pCollectionViewDataSource->numberOfItemsInRowsInSection(this, i, j); unsigned int cellWidth = 0; if (itemCount>0) { cellWidth = (width - m_nHoriInterval) / itemCount - m_nHoriInterval; } for (int k = 0; k < itemCount; k++) { CAIndexPath3E indexPath = CAIndexPath3E(i, j, k); DRect cellRect = DRect(m_nHoriInterval + (cellWidth + m_nHoriInterval)*k, y, cellWidth, iHeight); m_rUsedCollectionCellRects[indexPath] = cellRect; std::pair<std::map<CAIndexPath3E, CACollectionViewCell*>::iterator, bool> itrResult = m_mpUsedCollectionCells.insert(std::make_pair(indexPath, (CACollectionViewCell*)NULL)); CC_CONTINUE_IF(!winRect.intersectsRect(cellRect)); CACollectionViewCell* cell = m_pCollectionViewDataSource->collectionCellAtIndex(this, cellRect.size, i, j, k); if (cell) { addSubview(cell); cell->setFrame(cellRect); cell->m_nSection = i; cell->m_nRow = j; cell->m_nItem = k; itrResult.first->second = cell; m_vpUsedCollectionCells.pushBack(cell); if (m_pCollectionViewDataSource) { m_pCollectionViewDataSource->collectionViewWillDisplayCellAtIndex(this, cell, i, j, k); } } } y += (iHeight + m_nVertInterval); } unsigned int iSectionFooterHeight = m_nSectionFooterHeights.at(i); DRect sectionFooterRect = DRect(0, y, width, iSectionFooterHeight); if (iSectionFooterHeight > 0) { CAView* pSectionFooterView = m_pCollectionViewDataSource->collectionViewSectionViewForFooterInSection(this, sectionFooterRect.size, i); if (pSectionFooterView != NULL) { pSectionFooterView->setDisplayRange(true); pSectionFooterView->setFrame(sectionFooterRect); insertSubview(pSectionFooterView, 1); m_pSectionFooterViews[i] = pSectionFooterView; y += iSectionFooterHeight; } } DRect sectionRect = sectionHeaderRect; sectionRect.size.height = sectionFooterRect.origin.y + sectionFooterRect.size.height - sectionHeaderRect.origin.y; m_rSectionRects[begin + i] = sectionRect; } if (m_nCollectionFooterHeight > 0 && m_pCollectionFooterView) { m_pCollectionFooterView->setFrame(DRect(0, y, width, m_nCollectionFooterHeight)); addSubview(m_pCollectionFooterView); y += m_nCollectionFooterHeight; } this->updateSectionHeaderAndFooterRects(); this->layoutPullToRefreshView(); this->startDeaccelerateScroll(); }