Como exibir a folha de ação de compartilhamento padrão do iOS 6 com as opções de compartilhamento disponíveis?

97

Alguns aplicativos mostram uma folha de ação padrão no iOS 6 com opções de compartilhamento.

O Social Framework tem apenas duas classes, uma para composição e outra para solicitação.

O que descobri, porém, é sobre como compor para um determinado serviço com SLComposeViewController e antes de mostrar isso, devo consultar manualmente se o serviço está disponível. E então eu também tenho que criar minha própria planilha de ação com os próprios ícones.

Como esses aplicativos mostram esta folha de ação de opções de compartilhamento padrão no iOS 6? Ou eles estão usando uma estrutura de código aberto?

rã aberta
fonte
Eu quero abrir a planilha de compartilhamento com ícone personalizado como wechat, weibo, qq e integrar a funcionalidade dele, como posso fazer isso?
Ravi Ojha
Verifique também este link .. stackoverflow.com/a/35267035/3908884
Conheça Doshi de

Respostas:

223

O UIActivityViewController declarado na outra resposta torna isso trivial. Tudo o que você precisa fazer é especificar o texto / imagem / URL que deseja compartilhar e apresentar o controlador de visualização de atividade modalmente e o iOS exibirá automaticamente todos os serviços de compartilhamento aplicáveis. Exemplos:

Objective-C

- (void)shareText:(NSString *)text andImage:(UIImage *)image andUrl:(URL *)url
{
    NSMutableArray *sharingItems = [NSMutableArray new];

    if (text) {
        [sharingItems addObject:text];
    }
    if (image) {
        [sharingItems addObject:image];
    }
    if (url) {
        [sharingItems addObject:url];
    }

    UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:sharingItems applicationActivities:nil];
    [self presentViewController:activityController animated:YES completion:nil];
}

Rápido

func share(sharingText: String?, sharingImage: UIImage?, sharingURL: URL?) {
    let sharingItems:[AnyObject?] = [
                                        sharingText as AnyObject,
                                        sharingImage as AnyObject,
                                        sharingURL as AnyObject
                                    ] 
    let activityViewController = UIActivityViewController(activityItems: sharingItems.compactMap({$0}), applicationActivities: nil)
    if UIDevice.current.userInterfaceIdiom == .pad {
        activityViewController.popoverPresentationController?.sourceView = view
    }
    present(activityViewController, animated: true, completion: nil)
}
Mick MacCallum
fonte
6
Boa edição para a versão Swift. Eu mudaria o .append (item) por um item + =. Parece mais rápido
Ignacio Inglese
2
Na versão mais recente do Swift, substitua AnyObject[]()por[AnyObject]()
Ruben Martinez Jr.
5
Está funcionando, somente após o login nas respectivas contas nas configurações (facebook / twitter), mas no app de fotos / app de notas, as opções ficam disponíveis mesmo que o usuário não esteja logado, poderia explicar o porquê? Ou existe alguma outra solução alternativa?
Jaldip Katre
4
Eu adicionei uma edição para suporte a iOS 8 no iPad - você também precisa configurar o UIActivityViewControllerdo UIPopoverControllerou ele travará present…. Tive duas rejeições de três na edição até agora, então, supondo que seja rejeitada, talvez você possa ver se deseja adicionar a edição sozinho. Ou não :-)
Benjohn
Oh, a edição cita esta resposta que explica tudo.
Benjohn
39

Adicione isso para usar o UIActivityViewController.

-(IBAction)shareButtonPressed:(id)sender {

    NSLog(@"shareButton pressed");

    NSString *texttoshare = _txt; //this is your text string to share
    UIImage *imagetoshare = _img; //this is your image to share
    NSArray *activityItems = @[texttoshare, imagetoshare];    
    UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
    activityVC.excludedActivityTypes = @[UIActivityTypeAssignToContact, UIActivityTypePrint];
    [self presentViewController:activityVC animated:TRUE completion:nil];
}
Davide
fonte
2
Resposta preferida para mim já que você também mostra exclusão.
José