Как создать кнопку «еще», когда пользователь проведет пальцем по ячейке в табличном представлении (как почтовое приложение в ios 7)
Я искал эту информацию и здесь, и на форуме Cocoa Touch, но, похоже, я не могу найти ответ, и я надеюсь, что кто-то умнее меня сможет дать мне решение.
Мне бы хотелось, чтобы, когда пользователь проводит пальцем по ячейке табличного представления, отображалось более одной кнопки редактирования (по умолчанию это кнопка удаления). В приложении Почта для iOS 7 вы можете провести пальцем, чтобы удалить, но есть кнопка «БОЛЬШЕ», которая появляется.
ios
uitableview
user-interface
cocoa-touch
swipe-gesture
Гай Кэлон
источник
источник
Ответы:
Как реализовать
Похоже, iOS 8 открывает этот API. Намеки на такую функциональность присутствуют в бета-версии 2.
Чтобы что-то работало, реализуйте следующие два метода в делегате вашего UITableView, чтобы получить желаемый эффект (см. Пример в gist).
Известные проблемы
В документации сказано, что tableView: commitEditingStyle: forRowAtIndexPath:
Тем не менее, смахивание не работает без него. Даже если заглушка метода пуста, она все еще нужна, пока. Это, очевидно, ошибка в бета-версии 2.
источники
https://twitter.com/marksands/status/481642991745265664 https://gist.github.com/marksands/76558707f583dbb8f870
Оригинальный ответ: https://stackoverflow.com/a/24540538/870028
Обновить:
Пример кода с этой работой (In Swift): http://dropbox.com/s/0fvxosft2mq2v5m/DeleteRowExampleSwift.zip
Пример кода содержит этот простой для понимания метод в MasterViewController.swift, и только с помощью этого метода вы получаете поведение, показанное на скриншоте OP:
источник
tableView.editing = false
(NO
в objc) и ячейка будет "закрыта".Я создал новую библиотеку для реализации переключаемых кнопок, которая поддерживает различные переходы и расширяемые кнопки, такие как почтовое приложение iOS 8.
https://github.com/MortimerGoro/MGSwipeTableCell
Эта библиотека совместима со всеми различными способами создания UITableViewCell и протестирована на iOS 5, iOS 6, iOS 7 и iOS 8.
Вот пример некоторых переходов:
Пограничный переход:
Клип переход
3D переход:
источник
Джонни - правильный ответ. Я просто добавляю это ниже в target-c, чтобы сделать его более понятным для новичков (и тех из нас, кто отказывается изучать синтаксис Swift :)
Убедитесь, что вы объявили uitableviewdelegate и имеете следующие методы:
источник
Это (довольно смешно) частный API.
Следующие два метода являются частными и отправляются делегату UITableView:
Они довольно понятны.
источник
Чтобы улучшить ответ Джонни, теперь это можно сделать с помощью общедоступного API следующим образом:
источник
Я надеюсь, вы не можете ждать, пока яблоко не даст вам то, что вам нужно, верно? Так что вот мой вариант.
Создайте собственную ячейку. Есть два uiviews в нем
В нижнем представлении добавьте все нужные вам кнопки. Сделайте свои действия так же, как любые другие IBActions. Вы можете выбрать время анимации, стиль и прочее.
Теперь добавьте uiswipegesture к верхнему виду и покажите свое нижнее представление жестом смахивания. Я делал это раньше, и это самый простой вариант, насколько я понимаю.
Надеюсь, что поможет.
источник
Это невозможно при использовании стандартного SDK. Однако существуют различные сторонние решения, которые более или менее имитируют поведение в Mail.app. Некоторые из них (например, MCSwipeTableViewCell , DAContextMenuTableViewController , RMSwipeTableViewCell ) обнаруживают пролистывания с помощью распознавателей жестов, некоторые из них (например, SWTableViewCell ) помещают второй UISScrollView ниже стандарта
UITableViewCellScrollView
(частное подпредставлениеUITableViewCell
), а некоторые изменяют поведениеUITableViewCellScrollView
.Мне больше нравится последний подход, так как сенсорное управление кажется наиболее естественным. В частности, MSCMoreOptionTableViewCell это хорошо. Ваш выбор может варьироваться в зависимости от ваших конкретных потребностей (требуется ли панорамирование слева направо, требуется ли совместимость с iOS 6 и т. Д.). Также имейте в виду, что большинство из этих подходов сопряжены с бременем: они могут легко сломаться в будущей версии iOS, если Apple внесет изменения в
UITableViewCell
иерархию подпредставлений.источник
Код версии Swift 3 без использования какой-либо библиотеки:
источник
Вам нужно создать подкласс
UITableViewCell
и метод подкласса,willTransitionToState:(UITableViewCellStateMask)state
который вызывается всякий раз, когда пользователь проводит ячейку.state
флаги будут препятствовать вам знать , если кнопка Delete показывает, и показать / вашу кнопку Больше там спрятаться.К сожалению, этот метод не дает ни ширину кнопки «Удалить», ни время анимации. Поэтому вам нужно наблюдать и жестко кодировать время и время анимации вашей кнопки More в своем коде (лично я думаю, что Apple нужно что-то с этим сделать).
источник
Для быстрого программирования
источник
ЭТО МОЖЕТ ПОМОЧЬ ВАМ.
источник
Я хотел добавить ту же функциональность в свое приложение, и, пройдя так много разных уроков ( raywenderlich - лучшее решение для самостоятельной работы), я обнаружил, что у Apple есть свои собственные
UITableViewRowAction
класс, который очень удобен.Вы должны изменить метод котировки Tableview следующим образом:
Вы можете узнать больше об этом на этом сайте . Собственная документация Apple очень полезна для изменения цвета фона:
Если вы хотите изменить шрифт кнопки, это немного сложнее. Я видел еще один пост на SO. Для обеспечения кода, а также ссылки, вот код, который они использовали там. Вам придется изменить внешний вид кнопки. Вам нужно было бы сделать конкретную ссылку на tableviewcell, иначе вы бы изменили внешний вид кнопки во всем приложении (я не хотел этого, но вы могли бы, я не знаю :))
Цель C:
Swift:
Это самая легкая и самая оптимизированная версия ИМХО. Надеюсь, поможет.
Обновление: вот версия Swift 3.0:
источник
shareMenu.
не беретaddAction
метод. СпасибоActual Swift 3 Ответ
Это единственная функция, которая вам нужна. Вам не нужны функции CanEdit или CommitEditingStyle для пользовательских действий.
источник
Начиная с iOS 11 это общедоступно в
UITableViewDelegate
. Вот пример кода:Так же доступно:
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath;
Документы: https://developer.apple.com/documentation/uikit/uitableviewdelegate/2902367-tableview?language=objc.
источник
Swift 4 и 11+
источник
Я использовал tableViewCell, чтобы показать несколько данных, после того, как swipe () справа налево на ячейку, он покажет две кнопки Approve и reject, есть два метода, первый - ApproveFunc, который принимает один аргумент, и другой - RejectFunc, который также принимает один аргумент
источник
Вот несколько хрупкий способ сделать это, который не требует частных API или создания вашей собственной системы. Вы делаете ставки на то, что Apple не нарушит этого и, надеюсь, они выпустят API, которым вы сможете заменить эти несколько строк кода.
Это также требует, чтобы вы реализовали стандартный обратный вызов делегата редактирования табличного представления.
источник
Есть удивительная библиотека под названием
SwipeCellKit
, она должна получить больше признания. На мой взгляд, это круче, чемMGSwipeTableCell
. Последний не полностью повторяет поведение ячеек приложения Почта, в то время какSwipeCellKit
делает. Посмотриисточник
SwipeCellKit
и был впечатлен ... пока я не получил одно из тех исключений, потому что число строк до обновления табличного представления не было таким же, как после обновления +/- изменения в строках. Дело в том, что я никогда не менял свой набор данных. Так что, если это не беспокоит, я не знаю, что это. Поэтому я решил не использовать его и просто использовал новые методы UITableViewDelegate. Если вам нужно больше настроек, вы всегда можете переопределитьwillBeginEditingRowAt: ....
Swift 4
источник
sourceView
- это «Вид, в котором отображалось действие». Для получения дополнительной информации, поиск "UIContextualAction.Handler".Вот одно простое решение. Он способен отображать и скрывать пользовательский UIView внутри UITableViewCell. Логика отображения содержится внутри класса, расширенного от UITableViewCell, BaseTableViewCell.
BaseTableViewCell.h
BaseTableViewCell.M
Чтобы получить эту функциональность, просто расширьте ячейку табличного представления из BaseTableViewCell.
Затем внутри UIViewController, который реализует UITableViewDelegate, создайте два распознавателя жестов для обработки левого и правого пролистывания.
Чем добавить два обработчика смахивания
Теперь внутри cellForRowAtIndexPath, UITableViewDelegate, вы можете создать пользовательский UIView и прикрепить его к изъятой ячейке.
Конечно, этот способ загрузки пользовательских UIView только для этого примера. Управляй как хочешь.
источник