Como criar um botão "mais" quando o usuário desliza uma célula na exibição de tabela (como o aplicativo de email no ios 7)
Eu estive procurando essas informações aqui e no fórum Cocoa Touch, mas não consigo encontrar a resposta e espero que alguém mais inteligente do que eu possa me dar uma solução.
Gostaria que, quando o usuário deslize uma célula de exibição de tabela, exiba mais de um botão de edição (o padrão é o botão de exclusão). No aplicativo Mail para iOS 7, você pode deslizar para excluir, mas existe um botão "MAIS" que aparece.
ios
uitableview
user-interface
cocoa-touch
swipe-gesture
Guy Kahlon
fonte
fonte
Respostas:
Como implementar
Parece que o iOS 8 abre essa API. Dicas dessa funcionalidade estão presentes na Beta 2.
Para que algo funcione, implemente os dois métodos a seguir no delegado do UITableView para obter o efeito desejado (consulte a lista principal, por exemplo).
Problemas conhecidos
A documentação diz tableView: commitEditingStyle: forRowAtIndexPath é:
No entanto, a passagem não funciona sem ela. Mesmo que o stub do método esteja em branco, ele ainda precisa dele, por enquanto. Obviamente, isso é um bug na versão beta 2.
Fontes
https://twitter.com/marksands/status/481642991745265664 https://gist.github.com/marksands/76558707f583dbb8f870
Resposta original: https://stackoverflow.com/a/24540538/870028
Atualizar:
Código de exemplo com este trabalho (In Swift): http://dropbox.com/s/0fvxosft2mq2v5m/DeleteRowExampleSwift.zip
O código de exemplo contém esse método fácil de seguir em MasterViewController.swift e, com esse método, você obtém o comportamento mostrado na captura de tela do OP:
fonte
tableView.editing = false
(NO
em objc) e a célula "fecha".Criei uma nova biblioteca para implementar botões comutáveis que suportam uma variedade de transições e botões expansíveis, como o aplicativo de email iOS 8.
https://github.com/MortimerGoro/MGSwipeTableCell
Essa biblioteca é compatível com todas as diferentes maneiras de criar um UITableViewCell e testada no iOS 5, iOS 6, iOS 7 e iOS 8.
Aqui está um exemplo de algumas transições:
Transição de fronteira:
Transição de clipe
Transição 3D:
fonte
A resposta de Johnny é a certa para votar. Estou adicionando isso abaixo no objetivo-c para tornar mais claro para iniciantes (e aqueles de nós que se recusam a aprender a sintaxe do Swift :)
Certifique-se de declarar o uitableviewdelegate e tenha os seguintes métodos:
fonte
Esta é (ridiculamente) uma API privada.
Os dois métodos a seguir são particulares e enviados ao delegado do UITableView:
Eles são bastante auto-explicativos.
fonte
Para melhorar a resposta de Johnny, agora isso pode ser feito usando a API pública da seguinte maneira:
fonte
Espero que você não possa esperar até que a maçã lhe dê o que você precisa, certo? Então aqui está a minha opção.
Crie uma célula personalizada. Tem duas vistas panorâmicas nele
Na visão inferior, adicione os botões de que você precisar. Lide suas ações como qualquer outra IBActions. você pode decidir o tempo, estilo e qualquer coisa da animação.
Agora, adicione uma vista geral à vista superior e revele a vista inferior com um gesto de furto. Eu já fiz isso antes e é a opção mais simples para mim.
Espero que ajude.
fonte
Isso não é possível usando o SDK padrão. No entanto, existem várias soluções de terceiros que mais ou menos imitam o comportamento no Mail.app. Alguns deles (por exemplo , MCSwipeTableViewCell , DAContextMenuTableViewController , RMSwipeTableViewCell ) detectam furtos usando reconhecedores de gestos, alguns deles (por exemplo, SWTableViewCell ) colocam um segundo UISScrollView abaixo do padrão
UITableViewCellScrollView
( sub-visualização privada deUITableViewCell
) e alguns deles modificam o comportamento deUITableViewCellScrollView
.Eu gosto mais da última abordagem, já que o manuseio por toque parece mais natural. Especificamente, o MSCMoreOptionTableViewCell é bom. Sua escolha pode variar de acordo com suas necessidades específicas (se você também precisa de uma panorâmica da esquerda para a direita, se precisa da compatibilidade com o iOS 6 etc.). Lembre-se também de que a maioria dessas abordagens traz um ônus: elas podem ser facilmente quebradas em uma versão futura do iOS se a Apple fizer alterações na
UITableViewCell
hierarquia de subvisões.fonte
Código da versão Swift 3 sem usar nenhuma biblioteca:
fonte
Você precisa da subclasse
UITableViewCell
e do método da subclassewillTransitionToState:(UITableViewCellStateMask)state
que é chamado sempre que o usuário desliza a célula. Osstate
sinalizadores informam se o botão Excluir está sendo exibido e mostram / ocultam o botão Mais lá.Infelizmente, esse método não fornece a largura do botão Excluir nem o tempo da animação. Portanto, você precisa observar e codificar o quadro e o tempo de animação do seu botão Mais no seu código (eu pessoalmente acho que a Apple precisa fazer algo sobre isso).
fonte
Para programação rápida
fonte
Isso poderia ajudá-lo.
fonte
Eu estava procurando adicionar a mesma funcionalidade ao meu aplicativo e, depois de passar por tantos tutoriais diferentes ( raywenderlich sendo a melhor solução de bricolage), descobri que a Apple tem sua própria
UITableViewRowAction
classe, o que é muito útil.Você precisa alterar o método boilerpoint do Tableview para isso:
Você pode descobrir mais sobre isso neste site . A documentação da Apple é realmente útil para alterar a cor de fundo:
Se você quiser alterar a fonte do botão, é um pouco mais complicado. Eu já vi outro post no SO. Para fornecer o código e o link, eis o código que eles usaram lá. Você teria que mudar a aparência do botão. Você precisaria fazer uma referência específica à tableviewcell, caso contrário, alteraria a aparência do botão em todo o aplicativo (eu não queria isso, mas você pode, não sei :))
Objetivo C:
Rápido:
Esta é a versão IMHO mais fácil e mais alinhada ao fluxo. Espero que ajude.
Atualização: Aqui está a versão do Swift 3.0:
fonte
shareMenu.
não usa umaddAction
método. ObrigadoResposta Swift real 3
Esta é a única função que você precisa. Você não precisa das funções CanEdit ou CommitEditingStyle para ações personalizadas.
fonte
A partir do iOS 11, isso está disponível publicamente em
UITableViewDelegate
. Aqui está um exemplo de código:Também disponível:
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath;
Documentos: https://developer.apple.com/documentation/uikit/uitableviewdelegate/2902367-tableview?language=objc
fonte
Swift 4 e iOs 11 ou superior
fonte
Eu usei o tableViewCell para mostrar vários dados; depois de deslizar () da direita para a esquerda em uma célula, ele mostrará dois botões. leva um argumento.
fonte
Aqui está uma maneira um tanto frágil de fazer isso que não envolve APIs privadas ou a construção de seu próprio sistema. Você está apostando que a Apple não quebra isso e que, com sorte, eles lançem uma API com a qual você pode substituir essas poucas linhas de código.
Isso também requer que você implemente a exibição de tabela padrão, editando retornos de chamada delegados.
fonte
Existe uma biblioteca incrível chamada
SwipeCellKit
, ela deveria ganhar mais reconhecimento. Na minha opinião, é mais legal do queMGSwipeTableCell
. O último não replica completamente o comportamento das células do aplicativo MailSwipeCellKit
. Dar uma olhadafonte
SwipeCellKit
e fiquei impressionado ... até receber uma dessas exceções porque o número de linhas antes de uma atualização de exibição de tabela não era o mesmo que após a atualização +/- a alteração nas linhas. O problema é que nunca mudei meu conjunto de dados. Então, se isso não é preocupante, não sei o que é. Então, decidi não usá-lo e apenas usei os novos métodos UITableViewDelegate. Se precisar de mais personalização, você sempre pode substituirwillBeginEditingRowAt: ....
Swift 4
fonte
sourceView
é "A exibição na qual a ação foi exibida". Para mais informações, procure "UIContextualAction.Handler".Aqui está uma solução simples. É capaz de exibir e ocultar o UIView personalizado dentro do UITableViewCell. A lógica de exibição está contida na classe estendida de UITableViewCell, BaseTableViewCell.
BaseTableViewCell.h
BaseTableViewCell.M
Para obter essa funcionalidade, estenda sua célula de exibição de tabela a partir de BaseTableViewCell.
Em seguida, o UIViewController interno, que implementa o UITableViewDelegate, cria dois reconhecedores de gestos para manipular os movimentos esquerdo e direito.
Do que adicionar dois manipuladores de furto
Agora, dentro de cellForRowAtIndexPath, de UITableViewDelegate, você pode criar UIView personalizado e anexá-lo à célula desenfileirada.
Obviamente, essa maneira de carregar o UIView personalizado é apenas para este exemplo. Gerencie-o como quiser.
fonte