iOS 自定义UIActivityViewController 的分享视频、多图片、手动发圈按钮

一、系统用法

1.1. 现在的微信SDK,暂时不支持,多图和视频发给好友。但是系统的分享确实可以的。下面来实现一波:

#1.如果是多图,items 存的是图片,所以我们要先把图片拿到,放置在 items 中即可
#2.如果是视频,items 存的就是视频的沙盒地址,然后包装成一个 NSURL 对象
 NSMutableArray *items = [NSMutableArray array];
#1.1.图片
#1.2.视频
//
//if ([filePath hasPrefix:@"file://"]) {
//                filePath = [filePath stringByReplacingOccurrencesOfString:@"file://" withString:@""];
 //          }
 //        NSURL *videoUrl = [NSURL fileURLWithPath:filePath];
//}
 UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];
            activityVC.completionWithItemsHandler = ^(UIActivityType  _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {
                NSLog(@"%@",activityType);
                if (completed) {
                    
                }
            };
 [self presentViewController:activityVC animated:YES completion:nil];

上面说的是分享的常规操作


二、自定义用法
自定义效果图 1
2.1 先做黑色提示部分
原理:自定义一个类继承于 UIActivityViewController,然后重写它相应的 view 方法,然后在里面添加相应的操作即可。如下:

1.首先自定义一个类继承于 UIActivityViewController,叫 XXActivityViewController

//XXActivityViewController.h 文件
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface XXActivityViewController : UIActivityViewController

@end

NS_ASSUME_NONNULL_END
//XXActivityViewController.m 文件
#import "XXActivityViewController.h"

@interface XXActivityViewController ()

@property (nonatomic, weak) UIView *tipView;

@end

@implementation XXActivityViewController

//重写 view 方法
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    //这里延迟加载一下,可能有的机型会错乱
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{    
        CGFloat tipViewH = 100;
        //这里 10:是黑色与它的间隔; 57:是取消按钮; 15:是间隔;safeAreaBottom:是底部安全距离一个宏而已
        UIView *av = [[UIView alloc] initWithFrame:CGRectMake(self.view.frame.origin.x, SCREEN_HEIGHT - self.view.frame.size.height - tipViewH - 10 - 57 - 15 + safeAreaBottom, self.view.frame.size.width, tipViewH)];
        av.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:.8];
        av.layer.cornerRadius = 5.0;
        av.layer.masksToBounds = YES;
        [[UIApplication sharedApplication].delegate.window addSubview:av];
        _tipView = av;
        
        //
        UILabel *lb = [[UILabel alloc] initWithFrame:CGRectMake(12, 15, self.view.frame.size.width - 12 * 2, tipViewH - 15 * 2)];
        lb.numberOfLines = 0;
        lb.text = @"文案已复制,选择分享到微信好友/群或朋友圈时,长按粘贴文案。\n好友通过识别分享的海报二维码即可进入你的店铺。";
        lb.font = [UIFont boldSystemFontOfSize:14];
        lb.textColor = [UIColor whiteColor];
        [av addSubview:lb];
    });
}

#//消失的时候,记得把我们添加的控件移除。否则会留在当前窗口
- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [_tipView removeFromSuperview];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

- (void)dealloc
{
    NSLog(@"%s  %@", __FUNCTION__, self.class);
}

@end
2.2 手动发圈按钮制作
原理:自定义一个类继承于 UIActivity,然后重写它相应的方法,然后在里面添加相应的操作即可。如下:
//XXActivity.h
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

typedef void(^ActionBlock)(void);

@interface XXActivity : UIActivity

@property (nonatomic, nullable) UIActivityType xxActivityType;
@property (nonatomic, nullable) NSString *xxActivityTitle;
@property (nonatomic, nullable) UIImage *xxActivityImage;
@property (nonatomic, nullable) NSString *xxActivityUrl;
@property (nonatomic, copy) ActionBlock itemActionCallBack;

- (id)initWithTitle:(NSString *)title image:(UIImage *)image openUrl:(NSString *)openUrl;

@end

NS_ASSUME_NONNULL_END
//XXActivity.m
#import "xxActivity.h"

@implementation xxActivity

- (id)initWithTitle:(NSString *)title image:(UIImage *)image openUrl:(NSString *)openUrl
{
    self = [super init];
    if (self) {
        self.xxActivityTitle = title;
        self.xxActivityUrl = openUrl;
        self.xxActivityImage = image;
    }
    return self;
}

+ (UIActivityCategory)activityCategory {
#//UIActivityCategoryAction 是下面那排灰色的,但是要注意图片的问题,图片有颜色的地方都是显示成灰色的,透明的才是白色显示。(就是和平时做图相反。)
    return UIActivityCategoryShare;
}
- (NSString *)activityType { return @"customAppType"; }
- (NSString *)activityTitle { return self.xxActivityTitle;}
- (UIImage *)activityImage { return self.xxActivityImage; }
- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems { return YES; }
- (void)prepareWithActivityItems:(NSArray *)activityItems {
    
}
- (UIViewController *) activityViewController { return nil; }
- (void)performActivity {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:self.xxActivityUrl] options:@{UIApplicationOpenURLOptionsSourceApplicationKey : @(YES)} completionHandler:^(BOOL success) {
        if (!success) {
            if ([self.xxActivityUrl hasPrefix:@"wechat://"]) {
               NSLog(@"请先安装微信客户端");
            }
        }else{
            if (_itemActionCallBack) {
                _itemActionCallBack();
            }
        }
    }];
}
到此重写结束,下面是使用:
#//这里的 items 就是上面开始说的东西(视频或图片),并不是软件哦
- (void)showSystemShareAlertVCWithItems:(NSArray *)items
{
    XXActivity *lineTimeActivity = [[XXActivity alloc] initWithTitle:@"手动发圈" image:IMG(@"jiaji_icon_penyq") openUrl:@"wechat://"];
    XXActivityViewController *activityVC = [[XXActivityViewController alloc] initWithActivityItems:items applicationActivities:@[lineTimeActivity]];
//这里是排除哪些系统自带不要的
    activityVC.excludedActivityTypes = @[UIActivityTypePostToFacebook,UIActivityTypePostToTwitter, UIActivityTypePostToWeibo,UIActivityTypeMessage,UIActivityTypeMail,UIActivityTypePrint,UIActivityTypeCopyToPasteboard,UIActivityTypeAssignToContact,UIActivityTypeAddToReadingList,UIActivityTypePostToFlickr,UIActivityTypePostToVimeo,UIActivityTypePostToTencentWeibo,UIActivityTypeAirDrop,UIActivityTypeOpenInIBooks];
    activityVC.completionWithItemsHandler = ^(UIActivityType  _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {
        NSLog(@"%@",activityType);
        if (completed) {
            
        }
    };
    [self presentViewController:activityVC animated:YES completion:nil];
}

本文到此结束。

总结:在自定义系统控件时,其实原理就是:重写它的方法,然后加入我们自己的实现。

声明:本文仅是学习笔记,如果涉及违法违规行为请联系删除,谢谢🙏

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 14,788评论 0赞 15
  • 各位关注由李克富老师坐阵,有神秘评委的西海岸团队和青岛团队的大比武,将延期举行。 原定于10月14日的比赛,将延期...
    大力133338阅读 446评论 0赞 2
  • 第二次参加拓展训练了,本可以寻一些借口不参加的,却不知道立马停下来忙碌的脚步,忙碌的回忆,我该怎么应对我的不知所措...
    万米先生阅读 497评论 3赞 0
  • 说到写作,大家也许不陌生,因为大家都学过写作文,其实,写作与写作文相差不大,那要怎么写好呢,大部分的人会说多...
    742859b115f8阅读 347评论 0赞 0
  • 女生节一到,高校男生们撩妹好时机来了 虽说离不开横幅、早餐、鲜花三件套 但好歹也是男生集体表达爱意暖意的仪式 然而...
    Shirleyachi阅读 446评论 0赞 0

友情链接更多精彩内容