頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


UIViewオブジェクトをドラッグする

UIViewオブジェクトをドラッグするってお話だよ。
正確にはドラッグとは言わないかな、指で抑えるとオブジェクトがすーと動くあの動作ね。

コードはこんな感じで。viewってのが動かしたいUIViewオブジェクトね。下のは同じviewController内にあるイメージだよ。
{
    //UIViewオブジェクトを作る
    UIView *view = [[UIView alloc] initWithFrame:(CGRect){10,10,50,50}];
    view.backgroundColor = [UIColor redColor];
    [self.view addSubview:view];
    [view release];

    //gesture recognizerを設定
    UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragView:)];
    [view addGestureRecognizer:panGestureRecognizer];
    [panGestureRecognizer release];
}

-(void)dragView:(UIPanGestureRecognizer *)sender
{
    //ドラッグ時にコールされるメソッド

    UIView *targetView = sender.view;
    CGPoint p = [sender translationInView:targetView];
    
    CGPoint movedPoint = CGPointMake(targetView.center.x + p.x, targetView.center.y + p.y);
    targetView.center = movedPoint;
    
    [sender setTranslation:CGPointZero inView:targetView];
}
しれっと書いてるけど、えらく苦労したんだよ。
前に似たような処理を書いたことがあったのでそれを参考にしたんだけど、ジェスチャーをどこに設定(addGestureRecognizer:)すんだよ?って悩んでさ。最初 view.superview (= self.view) に設定したもんだからタップ時の位置がviewの中にあるのか判定して、、、とか処理書いてたんだ。
やってるうちになんか違う、と思っていろいろ調べてたら上みたいに簡単に書けると気付いたよ。

ここで終わると何ヶ月後か何年後かわかんないけど、きっとまた同じような処理をしたい時に悩むことになるのが目に見えているので、再利用しやすいようにライブラリっぽくしておくことにしたんだ。
GestureUtilityクラスってことにしてこんな感じのクラスメソッドにしてみたよ。
//GestureUtility.m
+(void)setDragForView:(UIView *)view
{
    UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragView:)];
    [view addGestureRecognizer:panGestureRecognizer];
    [panGestureRecognizer release];
}

+(void)dragView:(UIPanGestureRecognizer *)sender
{
    UIView *targetView = sender.view;
    CGPoint p = [sender translationInView:targetView];
    
    CGPoint movedPoint = CGPointMake(targetView.center.x + p.x, targetView.center.y + p.y);
    targetView.center = movedPoint;
    
    [sender setTranslation:CGPointZero inView:targetView];
}
こんな感じで最近使い回しできそうなクラスは自分でまとめているんだよ。
そうすると、次に使いたい時に探す場所は決まってるし、そのまますぐに使えることもあるだろうし。

それに実際に使う側も
{
    //UIViewオブジェクトを作る
    UIView *view = [[UIView alloc] initWithFrame:(CGRect){10,10,50,50}];
    view.backgroundColor = [UIColor redColor];
    [self.view addSubview:view];
    [view release];

    [GestureUtility setDragForView:view];//ドラッグできるようにしとく
}
こんな感じで一行で済むので可読性もアップするでしょ?
やっぱり整理整頓、大事だね!(気付くの遅えよ、俺!)

<< Macのメモアプリが挙動不審になった件   TopPage  iPhoneの画面操作を録画するライブラリを使ってみた >>

コメント

サイコー!

2013.03.12   とおりすがり   編集

Re: タイトルなし

> サイコー!

サンクス!!

こういうコメントいいな。俺も役に立った記事には匿名でこういうコメントしようかなと思ったよ。

2013.03.15   たつや   編集

複数のview

こんにちは
サイトを拝見して参考にさせていただいていますが
複数のviewをドラッグできるようにするには
どうすればよいのでしょうか?
よろしくお願いいたします。

2014.03.21   のり   編集

Re: 複数のview

> こんにちは
> サイトを拝見して参考にさせていただいていますが
> 複数のviewをドラッグできるようにするには
> どうすればよいのでしょうか?
> よろしくお願いいたします。

それぞれのviewに設定する、ではダメなのでしょうか?

2014.03.24   たつや   編集

いいねこれ、楽しい。
ありがとう。

2014.09.22   まる   編集


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/714-5bc84640




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad