• iOS7 CookBook精彩瞬间(三)UIActivityViewController的基本使用及自定义Activity


    1.基本使用

    UIActivityViewController主要用于分享内容,创建activityView的方法很简单,调用下面的方法创建:

    [[UIActivityViewController alloc] initWithActivityItems: applicationActivities:]

    第一个参数为要分享的内容数组,可以为任何类,常见的为NSString和UIImage,第二个为自定义Activity数组,每个Activity对应一个按钮,如果只使用系统默认的传入nil。

    要显示这个View,使用modal的方式弹出即可。


    2.自定义Activity

    在微信中打开一个链接,可以通过右上角的按钮打开一个activityView来选择不同的功能,常用的有分享和复制链接,下面我们模拟这个情景,设计一个Activity,实现通过传入的地址用safari打开网站。

    ①要自定义Activity,要定义一个继承自UIActivity的类,然后重写获取标题、图片和有关活动允许的方法:

    头文件:

    #import <UIKit/UIKit.h>
    
    @interface BrowserActivity : UIActivity
    
    @end

    m文件:

    #import "BrowserActivity.h"
    
    @interface BrowserActivity ()
    
    @property (nonatomic, strong) NSArray *activityItems;
    
    @end
    
    @implementation BrowserActivity
    
    - (NSString *)activityTitle{
        
        return @"Browser";
        
    }
    
    - (UIImage *)activityImage{
        
        return [UIImage imageNamed:@"browser"];
        
    }
    
    - (NSString *)activityType{ // type用于唯一标识活动,一个比较好的方法是用bundleIdentifier加上类名
        
        return [[NSBundle mainBundle].bundleIdentifier stringByAppendingString:NSStringFromClass([self class])];
        
    }
    
    - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems{
        
        return YES;
        
    }
    
    - (void)prepareWithActivityItems:(NSArray *)activityItems{
        
        self.activityItems = [activityItems copy];
        
    }
    
    - (void)performActivity{
        
        if (self.activityItems.count < 1) {
            return;
        }
        NSString *url = [self.activityItems firstObject];
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
    }

    其中title决定了按钮的标题,image决定了按钮的图片,type用于唯一标识activity。

    为了安全性,系统会先调用- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems方法来询问是否可以执行,你可以根据items的类型判断是否合法,返回YES才会进一步操作,调用- (void)prepareWithActivityItems:(NSArray *)activityItems来加载数据,注意一般数据最好copy防止外部突然改变,最后系统会调用- (void)performActivity方法,在这个方法里执行Activity内容,我们是通过Safari打开这个URL。


    注意:这里假设传入的元素只有一个,并且是NSString,没有判断,存在隐患,实际应用应该在canPerformWithActivityItems:方法中判断是否可执行


    ②使用一个textField来编辑url,一个按钮来触发activityView:

    #import "ViewController.h"
    #import "BrowserActivity.h"
    
    @interface ViewController () <UITextFieldDelegate>
    @property (weak, nonatomic) IBOutlet UITextField *textField;
    @property (strong, nonatomic) UIActivityViewController *avc;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    
    - (IBAction)shareClick:(id)sender {
        
        [self presentViewController:self.avc animated:YES completion:nil];
        
    }
    
    - (UIActivityViewController *)avc{
        
        if (_avc == nil) {
            _avc = [[UIActivityViewController alloc] initWithActivityItems:@[self.textField.text] applicationActivities:@[[BrowserActivity new]]];
        }
        
        return _avc;
        
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
        
        [self.view endEditing:YES];
        
    }

    当按下share按钮时,会显示下图的界面:

    可以看到第二行已经有了Browser这个Activity,注意系统把图片渲染成了黑色。


    当点击了Browser时,即可执行活动,通过Safari打开特定URL。


  • 相关阅读:
    扩展DigitalClock显示日期+时间
    利用Handler定时更新Android UI
    CheckBox在表格中全选、部分选和反选
    jQuery实现表格间隔色
    Android中对话框(dialog)的使用
    The connection to adb is down, and a severe error has occured.
    struts2类型转化
    Android开发之旅:环境搭建及HelloWorld
    C/C++浮点数在内存中的存储方式
    用标签写登录界面
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154033.html
Copyright © 2020-2023  润新知