参考記事
UIActivityで追加したアイテムのアイコンをカラーにするPrivate API
環境
- Xcode 6.1
- LINEActivity 0.2.0
- iOS7.1.2, iOS8.1
iOS8でのカラーアイコン
LINEActivityにはモノクロームのLINEアイコンが同梱されていますが、iOS8のUIActivityは、カラーのアイコンがそのまま利用できます。
LINEActivityをCocoaPodsで利用していても、自分のアプリのアセットカタログに同名(LINEActivityIcon)のアイコンを登録しておけば、こちらが参照されます。
iOS7でのカラーアイコン
iOS8のみなら、これで解決なんですが、iOS7では、アイコンはカラー化されません。
この実装を、iOS7で動作させると以下のようなアイコンになってしまいます。
iOS7でカラーアイコンを表示させるには、参考記事の方法を採用せざるえないようです。
参考記事に従って、以下のメソッドを追加してやると、iOS7では、カラーアイコンが表示されます。
- (UIImage *)_activityImage
{
return [UIImage imageNamed:@"LINEActivityIcon.png"];
}
しかし、この方法はiOS8では副作用があるようで、以下のように小さなアイコンになってしまいます。
参考記事では、以下のメソッドを利用されていましたが、どれも同じ結果でしたので、ここでは簡単にUIImageで生成しています。
+ (id)_activityGenericImage:(id)arg1;
+ (id)_activityImageForApplication:(id)arg1;
+ (id)_activityFunctionImage:(id)arg1;
_activityImageForApplicationぐらいは動作するかなと思ったのですが…
iOS7,iOS8対応のアプリとなると、どのように切り替えればいいのかと思案につきています。
これでもいいかとあきらめかけましたが、
とりあえず、iOS7なら、アイコンはモノクロームでアクションカテゴリに配置し、iOS8なら、シェアカテゴリにカラーで表示するというアドホックな方法で逃げています。
Objective-Cには動的にメソッドを追加する機能があるようですが、OSのバージョンを判定して、iOS7なら、_activityImageメソッドを追加すればいいかなと考えていますが、swiftということもあり、いまいち方法がわかっていないのが正直なところです。
どなたか指南いただけると幸いです。
アイコンの置き場所
アイコンの置き場所を指定する方法も載せておきます。
参考記事でも記述されていますが、アイコンの置き場所はactivityCategoryメソッドで指定できます。UIActivityCategoryShareを返せば、上の段(シェアカテゴリ)へ配置されます。
しかし、順番までは指定できないようです。
+ (UIActivityCategory)activityCategory
{
// デフォルトはUIActivityCategoryAction(アクションカテゴリー)
return UIActivityCategoryShare;
}
順番は、UIActivityのシェアカテゴリのその他を選択すると、以下のような設定画面が表示されるので、ユーザーがドラッグして順序を変更できます。
追加コードは、直接、LINEActivityのソースコードへ追加してもよいですが、Objective-Cのカテゴリでアプリ側のソースコードに置いておくことができます。
#import <LINEActivity/LINEActivity.h>
@interface LINEActivity (Private)
+ (UIActivityCategory)activityCategory;
@end
@implementation LINEActivity (Private)
+ (UIActivityCategory)activityCategory
{
return UIActivityCategoryShare;
}
@end
私はswiftでコーディングしていますが、このようにObjective-Cのファイルも含めることができます。
こうしておけば、LINEActivityのソースやリソースは一切さわることなく、実装できます。
少し消化不良ですが、何かの参考になれば、幸いです。