So erfassen Sie die Scroll -Fertigstellung vor der Berechnung des Rahmens in Swift (iOS)? Der UICollectionView fungiert als Registerkarte, und wenn ein Element ausgewählt ist, aktualisiert der UitableView seinen Inhalt entsprechend. Der Fluss funktioniert wie folgt:
1. Zeigen Sie den ersten Tipp.
2. Scrollen Sie die UicollectionView, um eine Registerkarte auszuwählen.
3. Sobald die Registerkarte ausgewählt ist, aktualisieren Sie die UitableView und scrollen Sie bei Bedarf zur entsprechenden Zelle .
4. Finden Sie den Rahmen der Zielzelle und geben Sie sie an die Kometion weiter. Ich verwende derzeit DispatchQueue.main.asyncafter mit einer Verzögerung, um auf das Scrollen zu warten, aber dieser Ansatz ist unzuverlässig, da:
• verschiedene Geräte unterschiedliche Scrollengeschwindigkeiten haben. Genau, bevor Sie es an EasyTipView übergeben.func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
handleScrollCompletion(for: scrollView)
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
handleScrollCompletion(for: scrollView)
}
private func handleScrollCompletion(for scrollView: UIScrollView, completion: (() -> Void)? = nil) {
if scrollView == tableView, isTableViewScrolling {
isTableViewScrolling = false
completion?()
} else if scrollView == collectionView, isCollectionViewScrolling {
isCollectionViewScrolling = false
completion?()
}
}
private func checkIfScrollFinished(for scrollView: UIScrollView, completion: (() -> Void)? = nil) {
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if !scrollView.isDragging && !scrollView.isDecelerating {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self.handleScrollCompletion(for: scrollView, completion: completion)
}
}
}
}
< /code>
CollectionView -Logik: < /p>
private func scrollToTabAndGetFrame(for selectedTab: tabData, completion: ((CGRect?) -> Void)? = nil) {
isCollectionViewScrolling = true
viewModel?.selectedTab = selectedTab // -> Scrolls automatically when selectedTab changes
DispatchQueue.main.async {
self.collectionView.layoutIfNeeded()
self.checkIfScrollFinished(for: self.collectionView) { [weak self] in
guard let self = self else { return }
guard let index = self.viewModel?.tabData.firstIndex(where: { $0 == selectedTab }) else { return }
let indexPath = IndexPath(row: index, section: 0)
if let cell = self.collectionView.cellForItem(at: indexPath) {
let cellFrame = self.collectionView.convert(cell.frame, to: self.view)
completion?(cellFrame)
} else {
completion?(nil)
}
}
}
}
< /code>
tableView: < /p>
func scrollToCellAndGetFrame(for selectedTab: tabData, for cell: cellData, completion: ((CGRect?) -> Void)? = nil) {
isTableViewScrolling = true
viewModel?.selectedTab = selectedTab
DispatchQueue.main.async {
self.collectionView.layoutIfNeeded()
self.checkIfScrollFinished(for: self.collectionView) { [weak self] in
guard let self = self else { return }
guard let index = self.viewModel?.tabSections.firstIndex(where: { $0 == sectionType }) else { return }
let indexPath = IndexPath(row: index, section: 0)
self.tableView.scrollToRow(at: indexPath, at: .middle, animated: true)
self.checkIfScrollFinished(for: self.tableView) { [weak self] in
guard let self = self else { return }
if let cell = self.tableView.cellForRow(at: indexPath) {
let cellFrame = self.tableView.convert(cell.frame, to: self.view)
completion?(cellFrame)
} else {
completion?(nil)
}
}
}
}
}
< /code>
Wie kann ich zuverlässig erkennen, wann sowohl UicollectionView als auch UitableView -Scrollen vollständig abgeschlossen sind, und sicherzustellen, dass die Zelle ordnungsgemäß sichtbar ist, bevor der Rahmen berechnet wird, ist ein besseres Ansatz, als die Verwendung von ScrollviewDidendsCrollinganimation für eine bessere Annäherung für die Verstärkung für die Verstärkung zu verwenden. Implementierung wäre sehr geschätzt!
Wie erkenne ich vor der Berechnung des Rahmens die Scroll -Fertigstellung? ⇐ IOS
-
- Similar Topics
- Replies
- Views
- Last post