Jak utworzyć przycisk „więcej”, gdy użytkownik przesuwa komórkę w widoku tabeli (np. Aplikacja poczty w systemie iOS 7)
Szukałem tych informacji zarówno tutaj, jak i na forum Cocoa Touch, ale nie mogę znaleźć odpowiedzi i mam nadzieję, że ktoś mądrzejszy ode mnie da mi rozwiązanie.
Chciałbym, aby gdy użytkownik przesunął komórkę widoku tabeli, aby wyświetlić więcej niż jeden przycisk edycji (domyślnie jest to przycisk usuwania). W aplikacji Mail na iOS 7 możesz przesunąć palcem, aby usunąć, ale pojawia się przycisk „WIĘCEJ”.
ios
uitableview
user-interface
cocoa-touch
swipe-gesture
Guy Kahlon
źródło
źródło
Odpowiedzi:
Jak wdrożyć
Wygląda na to, że iOS 8 otwiera ten interfejs API. Wskazówki dotyczące takiej funkcjonalności są dostępne w wersji Beta 2.
Aby coś zadziałało, zaimplementuj następujące dwie metody na delegacie swojego UITableView, aby uzyskać pożądany efekt (patrz przykład w gist).
Znane problemy
Dokumentacja mówi, że tableView: commitEditingStyle: forRowAtIndexPath to:
Jednak przeciąganie nie działa bez niego. Nawet jeśli skrót metody jest pusty, to na razie go potrzebuje. Jest to oczywiście błąd w wersji beta 2.
Źródła
https://twitter.com/marksands/status/481642991745265664 https://gist.github.com/marksands/76558707f583dbb8f870
Oryginalna odpowiedź: https://stackoverflow.com/a/24540538/870028
Aktualizacja:
Przykładowy kod z działającym (w Swift): http://dropbox.com/s/0fvxosft2mq2v5m/DeleteRowExampleSwift.zip
Przykładowy kod zawiera tę łatwą do naśladowania metodę w MasterViewController.swift, a za pomocą tej metody można uzyskać zachowanie pokazane na zrzucie ekranu OP:
źródło
tableView.editing = false
(NO
w objc) i komórka będzie „blisko”.Utworzyłem nową bibliotekę do implementacji przesuwanych przycisków, która obsługuje różne przejścia i przyciski rozwijane, takie jak aplikacja poczty na iOS 8.
https://github.com/MortimerGoro/MGSwipeTableCell
Ta biblioteka jest kompatybilna ze wszystkimi różnymi sposobami tworzenia UITableViewCell i jest testowana na iOS 5, iOS 6, iOS 7 i iOS 8.
Oto próbka niektórych przejść:
Przejście graniczne:
Przejście klipu
Przejście 3D:
źródło
Odpowiedź Johnny'ego jest słuszna do wyrażenia opinii. Dodałem to poniżej w celu-c, aby było bardziej zrozumiałe dla początkujących (i tych z nas, którzy odmawiają nauki składni Swift :)
Upewnij się, że zadeklarowałeś opcję uitableviewdelegate i masz następujące metody:
źródło
To (raczej śmiesznie) prywatny interfejs API.
Następujące dwie metody są prywatne i wysyłane do delegata UITableView:
Są dość oczywiste.
źródło
Aby poprawić odpowiedź Johnny'ego, można to teraz zrobić za pomocą publicznego interfejsu API w następujący sposób:
źródło
Mam nadzieję, że nie możesz poczekać, aż jabłko da ci to, czego potrzebujesz, prawda? Oto moja opcja.
Utwórz niestandardową komórkę. Mają w sobie dwa uiviewy
W dolnym widoku dodaj dowolne potrzebne przyciski. Rozgrywaj swoje działania tak, jak inne IBAction. możesz wybrać czas animacji, styl i cokolwiek innego.
teraz dodaj uiswipegesture do górnego widoku i odsłaniaj swój dolny widok gestem machnięcia. Zrobiłem to już wcześniej i jest to dla mnie najprostsza opcja.
Mam nadzieję, że to pomoże.
źródło
Nie jest to możliwe przy użyciu standardowego zestawu SDK. Istnieją jednak różne rozwiązania innych firm, które mniej więcej naśladują zachowanie w Mail.app. Niektóre z nich (np. MCSwipeTableViewCell , DAContextMenuTableViewController , RMSwipeTableViewCell ) wykrywają przeciągnięcia za pomocą rozpoznawania gestów, niektóre (np. SWTableViewCell ) umieszczają drugi UISScrollView poniżej standardu
UITableViewCellScrollView
(prywatny podglądUITableViewCell
), a niektóre modyfikują zachowanieUITableViewCellScrollView
.Najbardziej podoba mi się ostatnie podejście, ponieważ obsługa dotykowa jest najbardziej naturalna. W szczególności MSCMoreOptionTableViewCell jest dobry. Twój wybór może się różnić w zależności od konkretnych potrzeb (czy potrzebujesz również panoramy od lewej do prawej, czy potrzebujesz zgodności z iOS 6 itp.). Należy również pamiętać, że większość z tych podejść wiąże się z dużym obciążeniem: mogą łatwo zepsuć się w przyszłej wersji iOS, jeśli Apple wprowadzi zmiany w
UITableViewCell
hierarchii widoków podrzędnych.źródło
Kod wersji Swift 3 bez użycia biblioteki:
źródło
Musisz podklasę
UITableViewCell
i metodę podklasy,willTransitionToState:(UITableViewCellStateMask)state
która jest wywoływana za każdym razem, gdy użytkownik przesuwa komórkę. Testate
flagi pozwoli Ci wiedzieć, jeśli przycisk Usuń pokazuje, i pokazać / ukryć tam swój przycisk Więcej.Niestety ta metoda nie daje ani szerokości przycisku Usuń, ani czasu animacji. Musisz więc obserwować i zakodować na stałe ramkę i czas animacji przycisku More w kodzie (osobiście uważam, że Apple musi coś z tym zrobić).
źródło
Do szybkiego programowania
źródło
TO MOŻE CI POMÓC.
źródło
Chciałem dodać tę samą funkcjonalność do mojej aplikacji i po przejściu tak wielu różnych samouczków ( raywenderlich jest najlepszym rozwiązaniem dla majsterkowiczów), dowiedziałem się, że Apple ma swoją
UITableViewRowAction
klasę, co jest bardzo przydatne.Musisz zmienić metodę punktu kotłowego Tableview na:
Możesz dowiedzieć się więcej na ten temat na tej stronie . Własna dokumentacja Apple jest naprawdę przydatna do zmiany koloru tła:
Jeśli chcesz zmienić czcionkę przycisku, jest to nieco trudniejsze. Widziałem inny post na SO. Aby podać kod, a także link, oto kod, którego tam użyli. Będziesz musiał zmienić wygląd przycisku. Musisz podać konkretne odniesienie do komórki widoku tabeli, w przeciwnym razie zmieniłbyś wygląd przycisku w całej aplikacji (nie chciałem tego, ale możesz, nie wiem :))
Cel C:
Szybki:
To najłatwiejsza i najbardziej podszywana strumieniem wersja IMHO. Mam nadzieję, że to pomoże.
Aktualizacja: Oto wersja Swift 3.0:
źródło
shareMenu.
nie stosujeaddAction
metody. DziękiRzeczywista odpowiedź Swift 3
To jest TYLKO funkcja, której potrzebujesz. Nie potrzebujesz funkcji CanEdit ani CommitEditingStyle do akcji niestandardowych.
źródło
Od iOS 11 jest to publicznie dostępne w
UITableViewDelegate
. Oto przykładowy kod:Także dostępny:
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath;
Dokumenty: https://developer.apple.com/documentation/uikit/uitableviewdelegate/2902367-tableview?language=objc
źródło
Swift 4 i iOs 11+
źródło
Użyłem tableViewCell, aby wyświetlić wiele danych, po przesunięciu palcem () od prawej do lewej na komórce pojawią się dwa przyciski Zatwierdź I odrzuć, są dwie metody, pierwsza to ApproveFunc, która przyjmuje jeden argument, a druga to RejectFunc, która również bierze jeden argument.
źródło
Oto nieco delikatny sposób, który nie wymaga prywatnych interfejsów API ani budowy własnego systemu. Zabezpieczasz swoje zakłady, że Apple tego nie przełamie i mam nadzieję, że wydadzą interfejs API, który możesz zastąpić kilkoma liniami kodu.
Wymaga to również wdrożenia standardowego wywołania zwrotnego delegowania edycji widoku tabeli.
źródło
Zadziwiająca biblioteka o nazwie
SwipeCellKit
powinna zyskać więcej uznania. Moim zdaniem jest fajniej niżMGSwipeTableCell
. Ten ostatni nie replikuje całkowicie zachowania komórek aplikacji Mail, podczas gdySwipeCellKit
robi. Spójrzźródło
SwipeCellKit
i byłem pod wrażeniem ... aż dostałem jeden z tych wyjątków, ponieważ liczba wierszy przed aktualizacją widoku tabeli nie była taka sama jak po aktualizacji +/- zmiana wierszy. Rzecz w tym, że nigdy nie zmieniłem mojego zestawu danych. Więc jeśli to nie martwi, nie wiem co jest. Więc postanowiłem nie używać go i po prostu użyłem nowych metod UITableViewDelegate. Jeśli potrzebujesz większej personalizacji, zawsze możesz zastąpićwillBeginEditingRowAt: ....
Szybki 4
źródło
sourceView
to „Widok, w którym akcja została wyświetlona”. Aby uzyskać więcej informacji, wyszukaj „UIContextualAction.Handler”.Oto jedno proste rozwiązanie. Jest w stanie wyświetlać i ukrywać niestandardowe UIView w UITableViewCell. Logika wyświetlania jest zawarta w klasie rozszerzonej z UITableViewCell, BaseTableViewCell.
BaseTableViewCell.h
BaseTableViewCell.M
Aby uzyskać tę funkcjonalność, po prostu rozszerz komórkę widoku tabeli z BaseTableViewCell.
Następnie Inside UIViewController, który implementuje UITableViewDelegate, tworzy dwa urządzenia rozpoznające gesty do obsługi przesunięć w lewo i w prawo.
Następnie dodaj dwa uchwyty machnięcia
Teraz, w komórce cellForRowAtIndexPath, z UITableViewDelegate, możesz utworzyć niestandardowy UIView i dołączyć go do komórki usuwanej z kolejki.
Oczywiście ten sposób ładowania niestandardowego UIView jest właśnie dla tego przykładu. Zarządzaj nim tak, jak chcesz.
źródło