LoginSignup
33
33

More than 5 years have passed since last update.

UIActivityにLINEActivityを追加して、アイコンをカラーにする

Posted at

参考記事

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

環境

  • Xcode 6.1
  • LINEActivity 0.2.0
  • iOS7.1.2, iOS8.1

iOS8でのカラーアイコン

LINEActivityにはモノクロームのLINEアイコンが同梱されていますが、iOS8のUIActivityは、カラーのアイコンがそのまま利用できます。

LINEActivityをCocoaPodsで利用していても、自分のアプリのアセットカタログに同名(LINEActivityIcon)のアイコンを登録しておけば、こちらが参照されます。

line-icon-ios8-n.png

iOS7でのカラーアイコン

iOS8のみなら、これで解決なんですが、iOS7では、アイコンはカラー化されません。

この実装を、iOS7で動作させると以下のようなアイコンになってしまいます。

line-icon-ios7-1-2.png

iOS7でカラーアイコンを表示させるには、参考記事の方法を採用せざるえないようです。

参考記事に従って、以下のメソッドを追加してやると、iOS7では、カラーアイコンが表示されます。

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

しかし、この方法はiOS8では副作用があるようで、以下のように小さなアイコンになってしまいます。

参考記事では、以下のメソッドを利用されていましたが、どれも同じ結果でしたので、ここでは簡単にUIImageで生成しています。

+ (id)_activityGenericImage:(id)arg1;
+ (id)_activityImageForApplication:(id)arg1;
+ (id)_activityFunctionImage:(id)arg1;

_activityImageForApplicationぐらいは動作するかなと思ったのですが…

line-icon-ios8-s.png

iOS7,iOS8対応のアプリとなると、どのように切り替えればいいのかと思案につきています。

これでもいいかとあきらめかけましたが、
とりあえず、iOS7なら、アイコンはモノクロームでアクションカテゴリに配置し、iOS8なら、シェアカテゴリにカラーで表示するというアドホックな方法で逃げています。

Objective-Cには動的にメソッドを追加する機能があるようですが、OSのバージョンを判定して、iOS7なら、_activityImageメソッドを追加すればいいかなと考えていますが、swiftということもあり、いまいち方法がわかっていないのが正直なところです。

どなたか指南いただけると幸いです。

アイコンの置き場所

アイコンの置き場所を指定する方法も載せておきます。
参考記事でも記述されていますが、アイコンの置き場所はactivityCategoryメソッドで指定できます。UIActivityCategoryShareを返せば、上の段(シェアカテゴリ)へ配置されます。
しかし、順番までは指定できないようです。

activityCategory

+ (UIActivityCategory)activityCategory
{
  // デフォルトはUIActivityCategoryAction(アクションカテゴリー)
  return UIActivityCategoryShare;
}

順番は、UIActivityのシェアカテゴリのその他を選択すると、以下のような設定画面が表示されるので、ユーザーがドラッグして順序を変更できます。

line-icon-other.png

追加コードは、直接、LINEActivityのソースコードへ追加してもよいですが、Objective-Cのカテゴリでアプリ側のソースコードに置いておくことができます。

LINEAcitivity+.m
#import <LINEActivity/LINEActivity.h>

@interface LINEActivity (Private)
+ (UIActivityCategory)activityCategory;
@end

@implementation LINEActivity (Private)

+ (UIActivityCategory)activityCategory
{
  return UIActivityCategoryShare;
}

@end

私はswiftでコーディングしていますが、このようにObjective-Cのファイルも含めることができます。

こうしておけば、LINEActivityのソースやリソースは一切さわることなく、実装できます。

少し消化不良ですが、何かの参考になれば、幸いです。

33
33
1

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
33
33