« google nexus7 googlePlayストアにて販売開始! | トップページ | コストパフォーマンス最高!なandroidタブレット『nexus7』レビュー »

Safariの共有で使われてるアイコンとラベルが表示されるUIを自作してみた。

Safariの共有で使われてるあのUI、UIActivityViewControllerというiOS6.0から追加された新しいUIなのですがあれが気に入ったので独自で似たようなUIを作ってみました。標準のUIを使ってるのでiOS6以前でも使えます。イメージ的にはUIActionSheet風に使えるように作ってあります。このプログラムはiPad用です。アイコンは144x144pixelで用意して下さい。

このコードをもっと使いやすいように改造してgit hub等で公開して頂いても構いませんよ〜。むしろお願いしますw

20120927_235140

「CustomActivity.h」をダウンロード

「CustomActivity.m」をダウンロード

サンプルコードをダウンロード

■ CustomActivity.h

//
//  CustomActivity.h
//  ViewAnimation
//
//  Created by ヒギ on 2012/09/26.
//

#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>

@protocol CustomActivityDelegate <NSObject>

-(void)customActivity:(id)activity clickedButtonAtIndex:(int)index;

@end

@interface CustomActivity : NSObject
{
    id delegate;

    NSMutableArray      *functionArray;
    UIPopoverController *popover;

    int tag;
}
@property (assign) id<CustomActivityDelegate> delegate;

@property(nonatomic,retain)NSMutableArray       *functionArray;
@property(nonatomic,retain)UIPopoverController  *popover;

@property(assign)int tag;

-(id)init;
-(id)initWithArray:(NSArray *)array;
-(void)addButtonWithTitle:(NSString*)title imageName:(NSString*)imageName;
-(void)showFromRect:(CGRect)rect inView:(UIView*)inView animated:(BOOL)animated;

@end

■ CustomActivity.m

//
//  CustomActivity.m
//  ViewAnimation
//
//  Created by ヒギ on 2012/09/26.
//

#import "CustomActivity.h"

//定数宣言
#define UP_MARGIN          25
#define LEFT_MARGIN       
46
#define BUTTON_X_INTERVAL 
118
#define BUTTON_Y_INTERVAL 
129

@implementation CustomActivity
{

}

@synthesize delegate;
@synthesize functionArray;
@synthesize popover;
@synthesize tag;

//------------------------------------------------------------------------
//初期化
//------------------------------------------------------------------------

-(id)init
{
    self = [super init];
    if (self)
    {
        functionArray = [[NSMutableArray alloc]init];
    }
    return self;
}

//------------------------------------------------------------------------
//初期化(配列付き)
//------------------------------------------------------------------------

-(id)initWithArray:(NSArray *)array
{
    self = [super init];
    if (self)
    {
        functionArray = [NSMutableArray arrayWithArray:array];
    }
    return self;
}

//------------------------------------------------------------------------
//項目を追加
//------------------------------------------------------------------------

-(void)addButtonWithTitle:(NSString*)title
                imageName:(NSString*)imageName
{
    NSDictionary *dict = [[NSDictionary alloc]initWithObjectsAndKeys:title,@"TITLE",imageName,@"IMAGE_NAME",nil];
    [functionArray addObject:dict];
    [dict release];
}

//------------------------------------------------------------------------
//カスタムアクティビティーを表示
//------------------------------------------------------------------------

-(void)showFromRect:(CGRect)rect
             inView:(UIView*)inView
           animated:(BOOL)animated
{
    UIViewController *vc = [[UIViewController alloc]init];
    UIView *view = [[UIView alloc]init];
    vc.view = view;
    [view release];

    int buttonYPos = (int)([functionArray count] / 3);

    CGSize size = CGSizeMake(LEFT_MARGIN + (BUTTON_X_INTERVAL * 3),
                             UP_MARGIN   + (BUTTON_Y_INTERVAL * buttonYPos));
    vc.view.frame = CGRectMake(0, 0, size.width, size.height);

    if ([functionArray count]>0)
    {
        for (int i=0; i<[functionArray count]; i++)
        {
            [self addButtonToView:vc.view dict:[functionArray objectAtIndex:i] index:i];
        }
    }
    self.functionArray = nil;

    UIPopoverController *pop = [[UIPopoverController alloc]initWithContentViewController:vc];
    [vc release];

    pop.popoverContentSize = size;
    [pop presentPopoverFromRect:rect inView:inView permittedArrowDirections:UIPopoverArrowDirectionAny animated:animated];

    self.popover = pop;
    [pop release];
}

//------------------------------------------------------------------------
//ビューにボタンやラベルを追加
//------------------------------------------------------------------------

-(void)addButtonToView:(UIView*)view
                  dict:(NSDictionary*)dict
                 index:(int)index
{
    NSString *buttonTitle   = [dict objectForKey:@"TITLE"];
    NSString *imageName     = [dict objectForKey:@"IMAGE_NAME"];

    int buttonXPos = index % 3;
    int buttonYPos = (int)(index / 3);

    //ボタン作成
    UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 72, 72)];
    [button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
    button.layer.cornerRadius    = 10;
    button.tag                   = index;
    button.backgroundColor       = [UIColor grayColor];
    button.clipsToBounds         = YES;

    NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
    UIImage *img = [[UIImage alloc]initWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",bundlePath,imageName]];

    [button setImage:img forState:UIControlStateNormal];
    [img release];

    button.center = CGPointMake(LEFT_MARGIN + (BUTTON_X_INTERVAL * buttonXPos + 36),
                                UP_MARGIN   + (BUTTON_Y_INTERVAL * buttonYPos + 36));

    [view addSubview:button];
    [button release];

    //ラベル作成
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, BUTTON_X_INTERVAL-4, BUTTON_Y_INTERVAL - 72)];
    label.textAlignment     = NSTextAlignmentCenter;
    label.textColor         = [UIColor whiteColor];
    label.backgroundColor   = [UIColor clearColor];
    label.font              = [UIFont fontWithName:@"Helvetica-Bold" size:15];
    label.numberOfLines     = 2;
    label.text              = buttonTitle;

    label.center = CGPointMake(LEFT_MARGIN + (BUTTON_X_INTERVAL * buttonXPos) + 36,
                               UP_MARGIN  + (BUTTON_Y_INTERVAL * buttonYPos) + ((BUTTON_Y_INTERVAL - 72)/2) + 72);

    [view addSubview:label];
    [label release];
}

//------------------------------------------------------------------------
//ボタンが押されたらdelegate
//------------------------------------------------------------------------

-(void)buttonTapped:(UIButton*)button
{
    [popover dismissPopoverAnimated:YES];
    self.popover = nil;
    [self.delegate customActivity:self clickedButtonAtIndex:button.tag];
}

//------------------------------------------------------------------------
//dealloc
//------------------------------------------------------------------------

-(void)dealloc
{
    [functionArray release];
    [popover release];

    [super dealloc];
}

@end

■ 使い方例

-(IBAction)showCustomActivity
{
    CustomActivity *activity = [[CustomActivity alloc]init];
    activity.delegate = self;
    activity.tag = 0;
   
    [activity addButtonWithTitle:@"Facebook"    imageName:@"facebook.jpg"];
    [activity addButtonWithTitle:@"Google"      imageName:@"google.jpg"];
    [activity addButtonWithTitle:@"Twitter"     imageName:@"twitter.jpg"];
    [activity addButtonWithTitle:@"Green"       imageName:@"green.jpg"];
    [activity addButtonWithTitle:@"RSS"         imageName:@"rss.jpg"];
    [activity addButtonWithTitle:@"共有"          imageName:@"kyouyuu.jpg"];
   
    [activity showFromRect:CGRectMake(100,22,0,0) inView:self.view animated:YES];
}

■ delegateメソッド

-(void)customActivity:(CustomActivity*)activity clickedButtonAtIndex:(int)index
{
    int tag = activity.tag;
   
    if(tag==0)
    {
        NSString *message = @"";
       
        if (index==0)
        {
            message = @"Facebook";
        }
        else if (index==1)
        {
            message = @"Google";
        }
        else if (index==2)
        {
            message = @"Twitter";
        }
        else if (index==3)
        {
            message = @"Green";
        }
        else if (index==4)
        {
            message = @"RSS";
        }
        else if (index==5)
        {
            message = @"共有";
        }
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"テスト" message:message delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK",nil];
        [alert show];
        [alert release];
    }
    [activity release];     //ここでreleaseします。
}

indexにはボタンの何番目が押されたかが渡されます。

« google nexus7 googlePlayストアにて販売開始! | トップページ | コストパフォーマンス最高!なandroidタブレット『nexus7』レビュー »

iPhone/iPadアプリ開発」カテゴリの記事

コメント

>かみやんさん
3カ所気づきました。
[vc release];と
self.popover=nilと
self.functionArray=nil;
がなかったので修正しました。

かみやんさんありがとうございます〜。
UIActivityViewControllerのUIなかなかいいですよね。

メモリ管理気にしてみたのですけどまだまだ詰めが甘かったみたいですね。是非添削して頂けると嬉しいです〜。

時間に余裕があれば添削したいところです

やー、あのアクションシートいいよねぇ。さっそく作るとはすごい!
ソース、メモリ管理が。。な気がします。ななめ読みだけど。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/137176/55751081

この記事へのトラックバック一覧です: Safariの共有で使われてるアイコンとラベルが表示されるUIを自作してみた。:

« google nexus7 googlePlayストアにて販売開始! | トップページ | コストパフォーマンス最高!なandroidタブレット『nexus7』レビュー »

フォト

ブログ内カテゴリー

Amazon

気になる商品

  • 氷菓OVA11.5話
  • XBox360限定ホワイトカラー
  • 3DSLL充電台
  • TOX2
  • けいおん
  • ブレイブリーデフォルト
  • Mac book Pro Retina
  • Macbook Pro Retina
  • EP-804AWホワイト
  • New iPad 16GB ブラック
  • New iPad 32GB ブラック
  • New iPad 64GB ブラック
  • New iPad 16GB ホワイト
  • New iPad 32GB ホワイト
  • New iPad ホワイト64GB
  • 映画けいおん!
  • FE覚醒
  • アルティメットまどか
  • PS Vitaホワイト
  • DEAD OR ALIVE 5
  • 初音ミク -Project DIVA- f アクセサリーセット
  • すーぱーそに子 グラビアVer
  • マブラヴ オルタ イーニァ
  • 初音ミクProject Diva f
  • iOS5プログラミングブック
  • Gジェネオーバーワールド
  • 猫と椅子(アリスVer)
  • GALAXY Note純正フリップカバー
  • 3DSLLシルバー
  • 3DSLLレッド
  • 3DSLLホワイト
無料ブログはココログ

バナー

  • すーぱーそに子初主演ゲーム『ソニコミ』を応援しています