LoginSignup
25
25

More than 5 years have passed since last update.

UIActivityで追加したアイテムのアイコンをカラーにするPrivate API

Posted at

UIActivityのアイコンは一般的、アルファチャンネル画像を指定して使い、iOS 6では銀色のアイコン、iOS 7では白いアイコンに変換されますよね。
うーん、Appleと同じくカラーのアイコンが使いたい・・

- (UIImage *)activityImage {
    return [UIImage imageNamed:@"SampleAcitvity.png"];
}

調査

適当にログを出して調査・・

カラーのSNSのアイコンを表示しているActivityは、_activityImageForApplication:の引数にcom.apple.MobileSMSというBundle Identifierを指定していることが分かります。
その後、_activityGenericImage:が呼び出されて、SMSアイコンが引数として入っている模様。
最終的に変換されたイメージは_UIMappedBitmapImageで返されています。

syslog

MobileSafari[1609]: +[<UIActivity: 0x3c601320> _activityImageForApplication:com.apple.MobileSMS]
MobileSafari[1609]: +[<UIActivity: 0x3c601320> _activityGenericImage:<_UIMappedBitmapImage: 0x15701f90>]
MobileSafari[1609]: rtn: <_UIMappedBitmapImage: 0x15701f90>

次にカラーでないアイコンは、_activityFunctionImage:の引数にUIImageなアイコンが入って_UIActivityFunctionImageとして返しています。

syslog

MobileSafari[1609]: +[<UIActivity: 0x3c601320> _activityFunctionImage:<UIImage: 0x15700250>]
MobileSafari[1609]: rtn: <_UIActivityFunctionImage: 0x15700320>

サンプルコード

これで、仕組みはだいたい分かるのでサンプルコードを示します。

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

@interface UIActivity (Private)
+ (id)_activityFunctionImage:(id)arg1;
+ (id)_activityGenericImage:(id)arg1;
+ (id)_activityImageForApplication:(id)arg1;
@end
SampleActivity.m
@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のリファレンスに書いています。

LINEアプリが存在し、はてなブックマークアプリが存在しない場合

2013-10-11 23.56.09.png

25
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
25