简介:
UIActivityViewController是苹果自带分享,可以分享到FaceBook、微博、微信、QQ、信息、邮件、备忘录等平台,不需要对接第三方SDK,当然了也支持自定义分享,也可以自己看看API里面写的,实现起来也很简单.简单调起分享和简单,代码如下:
NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];
UIImage *imageV = [UIImage imageNamed:@"123"];
NSString *str = @"五哥最帅";
NSArray *items = [NSArray arrayWithObjects:url,imageV,str, nil];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:nil];
这样就可以调起系统的分享功能,自己可以写一个Demo,运行看一下,接下来就是一些参数的设置,我们一起来看一下:
1.modalInPresentation/modalInPopover
//这个属性是设置分享弹起,点击视图外,是否可以消失,YES不消失,只能点击视图上面的取消按钮才能消失!
if (@available(iOS 13.0, *)) {
activityViewController.modalInPresentation = YES;
} else {
// Fallback on earlier versions
activityViewController.modalInPopover = YES;
}
2. excludedActivityTypes 去除特定的分享功能
//分享页面就看不见这3个平台
activityViewController.excludedActivityTypes = @[
UIActivityTypePostToFacebook,
UIActivityTypePostToTwitter,
UIActivityTypePostToWeibo,
];
3.在IPad 必须通过popover弹出分享页面,在iPhone和iPodtouch上,必须以模态的方式展现,否则会报错!
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) {
activityViewController.preferredContentSize = CGSizeMake(200.0f, 200.0f);
activityViewController.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController *popver = [activityViewController popoverPresentationController];
popver.permittedArrowDirections = UIPopoverArrowDirectionUp; // 箭头位置
popver.sourceRect = CGRectMake(30.0f, button.frame.origin.y, 300.0f, 300.0f); // 弹出视图显示位置
activityViewController.popoverPresentationController.sourceView = button;
[self presentViewController:activityViewController animated:YES completion:nil];
}
else
{
[self presentViewController:activityViewController animated:YES completion:nil];
}
4.分享成功和失败回调,如果你的App最低支持iOS8以下的需要判断以下
//iOS8之后
UIActivityViewControllerCompletionWithItemsHandler itemsBlock = ^(UIActivityType __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError){
NSLog(@"activityType == %@",activityType);
if (completed == YES) {
NSLog(@"completed");
} else {
NSLog(@"cancel");
}
};
activityViewController.completionWithItemsHandler = itemsBlock;
//iOS 8 之前
UIActivityViewControllerCompletionHandler handlerBlock = ^(UIActivityType __nullable activityType, BOOL completed){
NSLog(@"activityType == %@",activityType);
if (completed == YES) {
NSLog(@"completed");
} else {
NSLog(@"cancel");
}
};
activityVC.completionHandler = handlerBlock;
5.上面完成之后,就可以利用系统实现分享功能,接下来我们来自定义分享按钮,按钮是UIActivity类,那我们新创建一个类CustomActivity继承UIActivity如下:
//.h
#import <UIKit/UIKit.h>
@interface CustomActivity : UIActivity
#pragma mark -- 分享按钮title
@property (nonatomic, copy) NSString * title;
#pragma mark -- 分享按钮图片
@property (nonatomic, strong) UIImage * image;
#pragma mark -- URL
@property (nonatomic, strong) NSURL * url;
#pragma mark -- 平台类型
@property (nonatomic, copy) NSString * type;
#pragma mark -- 分享内容
@property (nonatomic, strong) NSArray * shareContexts;
- (instancetype)initWithTitie:(NSString *)title withActivityImage:(UIImage *)image withUrl:(NSURL *)url withType:(NSString *)type withShareContext:(NSArray *)shareContexts;
@end
//.m实现
#import "CustomActivity.h"
@implementation CustomActivity
- (instancetype)initWithTitie:(NSString *)title withActivityImage:(UIImage *)image withUrl:(NSURL *)url withType:(NSString *)type withShareContext:(NSArray *)shareContexts{
if(self == [super init]){
_title = title;
_image = image;
_url = url;
_type = type;
_shareContexts = shareContexts;
}
return self;
}
#pragma mark -- 显示的位置设置 最上面是AirDrop,中间是Share,下面是Action
+ (UIActivityCategory)activityCategory{
return UIActivityCategoryShare;
}
- (NSString *)activityType{
return _type;
}
- (NSString *)activityTitle {
return _title;
}
- (UIImage *)_activityImage {
//UIActivityCategoryAction时,系统默认会渲染图片,所以不能重写为 - (UIImage *)activityImage {return _image;}
return _image;
}
- (NSURL *)activityUrl{
return _url;
}
- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems {
if (activityItems.count > 0) {
return YES;
}
return NO;
}
#pragma mark -- 判断自定义的点击是哪个
- (void)prepareWithActivityItems:(NSArray *)activityItems {
if ([_type isEqualToString:@"customActivity"]) {
NSLog(@"customActivity");
}
else
{
NSLog(@"123213213213");
}
}
#pragma mark -- 告诉系统分享结束了
- (void)performActivity {
[self activityDidFinish:YES];
}
@end
6.怎么用呢,还记得之前创建分享时有个参数传的是 'nil'吗?
//声明一个自定义Activity
CustomActivity * customActivit = [[CustomActivity alloc] initWithTitie:@"大朗" withActivityImage:imageV withUrl:url withType:@"customActivity" withShareContext:items];
//之前传nil,把nil替换成customActivit
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:@[activities]];
applicationActivities:这个参数是个数组,所以我们可以自定义多个,看你的需求来做就好了,上面就是我了解到UIActivityViewController分享,有错误的地方请您指正,非常感谢!
网友评论