こんにちは、JAGA(@ja_gaimopotato)です。
iOS7がリリースされたので、公開しているアプリや開発中のアプリをiOS6やiOS7以上に対応していっているところです。
特にiOS6で公開された機能のうちiOS5では使えないものに関しては、今まで結構スルーしていたのでやっと導入しています。
UIActivityもその一つで、Blockを追加するカテゴリを作ったのでBlockActivityというレポジトリで、Githubに公開しました。
BlockActivityの機能
BlockActivityというサブクラスを用意しています。
ですが、このクラスを使わなくてもUIActicivityのサブクラスにカテゴリをインポートしていただくだけでも使えるようになっています。
機能はクラスメソッドでUIActivityのインスタンス生成して、performActivityメソッド内でBlockを実行します。
使い方
使い方は、簡単です。
例えば以下のような感じです。
初期化はこんな感じの実装になっています。
+(id)activityWithType:(NSString *)type
title:(NSString *)title
image:(UIImage *)image
actionBlock:(void (^)())actionBlock{
UIActivity *activity = [[self alloc]init];
if (activity) {
activity.activityType = type;
activity.activityTitle = title;
activity.activityImage = image;
activity.actionBlock = actionBlock;
}
return activity;
}
UIActivityViewControllerを呼び出すときは、こんな感じです。
-(void)showActivityView {
BlockActivity *activity = [BlockActivity activityWithType:@"activity Type" title:@"activity Name" image:nil actionBlock:^{
// ここにアクションを実装
// performActivity内で呼ばれる。
}];
UIActivityViewController *vc = [[UIActivityViewController alloc]initWithActivityItems:@[@"test"] applicationActivities:@[activity]];
[self presentViewController:vc animated:YES completion:nil];
}
UIActivityのボタンをタップすると通常は、performActivityが呼ばれます。
サブクラスの場合は、これをオーバーライドして独自のアクションを実装します。
BlockActivityでも、同様です。
ですがカテゴリで先にコードを仕込んでいて、サブクラスでperformActivityをオーバーライドしていない場合でもBlockが実行されるようになっています。
仮にperformActivityをサブクラスでオーバーライドした場合は、サブクラスものが優先されます。
そうする場合は好きなタイミングでactionBlock()を呼んでください。
こんな感じです。
-(void)performActivity{
// ここで実行する
self.actionBlock();
[self activityDidFinish:YES];
}
他にもちょっと便利にしているところがあります。
- 初期化時にアイコンデータがなくても呼び出せるように、自動的にサイズの無い画像を作るようにしています。
- activityTypeとactivityTitleとactivityImageをそれぞれプロパティでアクセスできるようにしています。(結局サブクラスでも独自で返す値を実装するので問題ないと判断していますが、いかがでしょう?)
と、ここまで紹介させていただいたBlockActivityですが気に入っていただけると嬉しいです。
またお役に立てそうなものができましたら公開します。