Próbuję replikować bezstykowa aby usunąć funkcję jak w tableview mail. Tylko tym razem potrzebuję go zbudować na kolekcji, ale mam trochę problemów. To pozioma lista przewijania z przesunięciem do usunięcia. Już uruchomiłem przesunięcie, ale mam problem z ustaleniem, w jaki sposób ustawić przesunięcie, aby usunąć/dotknąć, aby usunąć lub zignorować funkcję.Swipe usunąć na CollectionView
Więc używam następujący CollectionView:
func buildCollectionView() {
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
layout.minimumInteritemSpacing = 0;
layout.minimumLineSpacing = 4;
collectionView = UICollectionView(frame: CGRect(x: 0, y: screenSize.midY - 120, width: screenSize.width, height: 180), collectionViewLayout: layout)
collectionView.dataSource = self
collectionView.delegate = self
collectionView.register(VideoCell.self, forCellWithReuseIdentifier: "videoCell")
collectionView.showsHorizontalScrollIndicator = false
collectionView.showsVerticalScrollIndicator = false
collectionView.contentInset = UIEdgeInsetsMake(0, 20, 0, 30)
collectionView.backgroundColor = UIColor.white()
collectionView.alpha = 0.0
//can swipe cells outside collectionview region
collectionView.layer.masksToBounds = false
swipeUpRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.deleteCell))
swipeUpRecognizer.delegate = self
collectionView.addGestureRecognizer(swipeUpRecognizer)
collectionView.isUserInteractionEnabled = true
}
Mam zwyczaj videocell zawiera jeden obraz, a poniżej znajduje się przycisk Usuń. Więc jeśli przesuniesz obraz w górę, pojawi się przycisk kasowania. Nie wiem, czy to jest właściwy sposób, w jaki to zrobić:
class VideoCell : UICollectionViewCell {
var deleteView: UIButton!
var imageView: UIImageView!
override init(frame: CGRect) {
super.init(frame: frame)
deleteView = UIButton(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height))
deleteView.contentMode = UIViewContentMode.scaleAspectFit
contentView.addSubview(deleteView)
imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height))
imageView.contentMode = UIViewContentMode.scaleAspectFit
contentView.addSubview(imageView)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
i używam następującą logiką:
func deleteCell(sender: UIPanGestureRecognizer) {
let tapLocation = sender.location(in: self.collectionView)
let indexPath = self.collectionView.indexPathForItem(at: tapLocation)
if velocity.y < 0 {
//detect if there is a swipe up and detect it's distance. If the distance is far enough we snap the cells Imageview to the top otherwise we drop it back down. This works fine already.
}
}
Ale problem zaczyna się tam. Gdy moja komórka znajduje się poza granicami zbierania, nie mam już do niej dostępu. Nadal chcę go przesunąć, aby go usunąć. Mogę to zrobić tylko przesuwając przycisk "Usuń", ale chcę, aby widok powyżej niego był przesuwany. Lub jeśli dotknę obrazu poza widokiem kolekcji, powinien on wrócić do linii i nie usuwać jej.
Gdybym zwiększenie granic CollectionView mogę uniknąć tego problemu, ale nie mogę też przesunąć palcem, aby usunąć na zewnątrz komórki widocznego wzrostu. Jest to spowodowane przez tapLocation, która znajduje się wewnątrz widoku kolekcji i wykrywa wskaźnik indexPath. Coś, czego nie chcę. Chcę przesunąć palcem tylko do pracy w komórce kolekcji.
także przycisk, a obraz kolidować ze sobą, bo nie mogę ich rozróżnić. Obaj są w tej samej komórce, dlatego zastanawiam się, czy powinienem mieć przycisk usuwania w komórce. Lub gdzie powinienem umieścić to inaczej? Mogłabym też zrobić dwa przyciski i wyłączyć interakcję użytkownika w zależności od stanu, ale nie jestem pewna, jak to się skończy.
Jestem z pewnością zainteresowany twoim rozwiązaniem. Czy mógłbyś przekazać zaktualizowaną wersję githubowi, ponieważ obecnie otrzymuję pusty projekt! – Wouter125
O tak, jasne, to błąd, zawstydzający. Jest teraz aktualizowany! – Imbue
Działa jak urok. Było dokładnie to, czego szukałem. Już przepisałem to dla mojego pangesture, ale faktycznie szukałem jak powiększyć obszar komórki :) – Wouter125