UIActivityのアイコンは一般的、アルファチャンネル画像を指定して使い、iOS 6では銀色のアイコン、iOS 7では白いアイコンに変換されますよね。
うーん、Appleと同じくカラーのアイコンが使いたい・・
- (UIImage *)activityImage {
return [UIImage imageNamed:@"SampleAcitvity.png"];
}
調査
適当にログを出して調査・・
カラーのSNSのアイコンを表示しているActivityは、_activityImageForApplication:の引数にcom.apple.MobileSMSというBundle Identifierを指定していることが分かります。
その後、_activityGenericImage:が呼び出されて、SMSアイコンが引数として入っている模様。
最終的に変換されたイメージは_UIMappedBitmapImageで返されています。
MobileSafari[1609]: +[<UIActivity: 0x3c601320> _activityImageForApplication:com.apple.MobileSMS]
MobileSafari[1609]: +[<UIActivity: 0x3c601320> _activityGenericImage:<_UIMappedBitmapImage: 0x15701f90>]
MobileSafari[1609]: rtn: <_UIMappedBitmapImage: 0x15701f90>
次にカラーでないアイコンは、_activityFunctionImage:の引数にUIImageなアイコンが入って_UIActivityFunctionImageとして返しています。
MobileSafari[1609]: +[<UIActivity: 0x3c601320> _activityFunctionImage:<UIImage: 0x15700250>]
MobileSafari[1609]: rtn: <_UIActivityFunctionImage: 0x15700320>
サンプルコード
これで、仕組みはだいたい分かるのでサンプルコードを示します。
#import <UIKit/UIKit.h>
@interface LINEActivity : UIActivity
@end
@interface UIActivity (Private)
+ (id)_activityFunctionImage:(id)arg1;
+ (id)_activityGenericImage:(id)arg1;
+ (id)_activityImageForApplication:(id)arg1;
@end
@implementation SampleActivity
+ (UIActivityCategory)activityCategory
{
return UIActivityCategoryShare;
}
- (BOOL)isUsableHatena
{
return [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"hatenabookmark://"]];
}
/*
- (UIImage *)activityImageではなく- (UIImage *)_activityImage
*/
- (UIImage *)_activityImage
{
if ([self isUsableHatena])
return [NSClassFromString(@"UIActivity") _activityImageForApplication:@"jp.ne.hatena"];
else {
return [NSClassFromString(@"UIActivity") _activityFunctionImage:[UIImage imageNamed:@"SampleAcitvity.png"];
}
}
- (NSString *)activityTitle {
....
解説
**注意: - (UIImage )_activityImageを使うのがミソです。- (UIImage )activityImageでは駄目です。
_activityImageForApplication:で指定したBundle Identifierのアプリが存在しない場合は、アイコンが表示されないため、_activityFunctionImage:でアルファチャンネルな画像のアイコンを指定して表示させています。
また、_activityImageForApplication:を使わず_activityGenericImage:に直接、画像を指定してやるとカラーのアイコンが表示されると思います。試していない。
iOS 7からUIAcitivityが上段と下段に分かれましたが、通常追加したアイテムは下段に表示されます。
- (UIActivityCategory)activityCategoryにUIActivityCategoryShareを返せば上段に表示されます。これは、Appleのリファレンスに書いています。