O ImagePickerSheetController é uma biblioteca para iOS projetada para replicar a interface de seleção de mídia encontrada no iMessage. Ela oferece uma alternativa moderna ao UIImagePickerController padrão, permitindo que desenvolvedores criem fluxos de seleção de fotos e vídeos com uma experiência de usuário (UX) fluida e integrada, similar ao comportamento de um UIAlertController.
Vantagens da Biblioteca
- Interface Familiar: O design baseado no iMessage reduz a curva de aprendizado para o usuário final.
- Multisseleção Nativa: Suporte nativo para escolha de múltiplos arquivos de mídia de forma simultânea.
- Flexibilidade de Ações: Permite adicionar botões customizados para câmera, biblioteca ou ações específicas da aplicação.
- API Amigável: A sintaxe é fortemente inspirada no sistema de ações do iOS, facilitando a adoção por desenvolvedores que já conhecem o ecossistema UIKit.
Configuração do Ambiente
Gerneciadores de Dependências
Você pode integrar o componente via CocoaPods adicionando a seguinte linha ao seu Podfile:
pod "ImagePickerSheetController", "~> 0.9.1"
Para usuários de Carthage, inclua no seu Cartfile:
github "lbrndnr/ImagePickerSheetController" ~> 0.9.1
Permissões Necessárias
Como a biblioteca interage diretamente com dados privados do usuário, é obrigatório declarar as justificativas de uso no arquivo Info.plist:
<key>NSCameraUsageDescription</key>
<string>Precisamos de acesso à câmera para capturar fotos.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Precisamos de acesso à sua galeria para selecionar imagens.</string>
Exemplo Prático de Implementação
Abaixo, apresentamos uma forma de configurar o controlador com suporte a captura de mídia e acesso à galeria:
let pickerSheet = ImagePickerSheetController(mediaType: .imageAndVideo)
// Ação para capturar nova foto ou adicionar comentário
let cameraAction = ImagePickerAction(
title: "Tirar Foto",
secondaryTitle: "Adicionar Legenda",
handler: { _ in
self.abrirInterfaceDeCamera(.camera)
},
secondaryHandler: { _, totalImages in
print("Usuário deseja legendar \(totalImages) imagens")
}
)
pickerSheet.addAction(cameraAction)
// Ação para abrir a biblioteca de fotos
let libraryAction = ImagePickerAction(
title: "Galeria de Fotos",
secondaryTitle: { count in
return "Enviar \(count) selecionada(s)"
},
handler: { _ in
self.abrirInterfaceDeCamera(.photoLibrary)
},
secondaryHandler: { _, _ in
let assetsSelecionados = pickerSheet.selectedImageAssets
print("Processando assets: \(assetsSelecionados)")
}
)
pickerSheet.addAction(libraryAction)
// Botão de Cancelar
pickerSheet.addAction(ImagePickerAction(title: "Cancelar", style: .cancel))
// Apresentação do controlador
self.present(pickerSheet, animated: true, completion: nil)
Explorando Funcionalidades Principais
Tipos de Mídia
O controlador pode ser filtrado através do enum ImagePickerMediaType:
.image: Exibe apenas fotografias..video: Focado em arquivos de vídeo..imageAndVideo: Modo híbrido que permite ambos.
Customização de Botões
Cada ImagePickerAction pode assumir estados diferentes. O "título secundário" é exibido dinamicamente assim que o usuário seleciona uma imagem na pré-visualização, permitindo que botões estáticos (como "Galeria") se transformem em botões de ação imediata (como "Enviar 3 Fotos").
Internacionalização (i18n)
Para aplicações que suportam múltiplos idiomas, a biblioteca integra-se bem com arquivos .stringsdict, permitindo tratar regras de pluralização para as labels de contagem de fotos de forma automática.
Requisitos e Compatibilidade
- Versão mínima do iOS: 9.0
- Frameworks dependentes:
Photos.framework - Lingaugem: Swift
Para projetos que visam exclusivamente o iOS 10 ou superior e buscam uma interface ainda mais moderna (estilo "gaveta"), o mesmo autor disponibiliza o ImagePickerTrayController, que segue os princípios de design das versões mais recentes do sistema operacional.