質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

objective-cでUIImageViewを複数表示してグイグイと動かしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 604

otokichi_

score 19

タイトルの通りです。
下記コードのように画像を配列にたくさんいれて、for文でズラーッと並べました。
これらを画面上で1つ1つタップした時に、動かせるようにしたいです。

#import "ViewController.h"

@interface ViewController()

@end

@implementation ViewController

- (void)viewDidLoad{
    [super viewDidLoad];

    NSArray *items = @[[UIImage imageNamed:@"image1.png"],
                       [UIImage imageNamed:@"image2.png"],
                       [UIImage imageNamed:@"image3.png"]];

    // 生成したUIImageオブジェクトをImageViewに設定する
    for (int i = 0; i < items.count; i++) {

        UIImageView *imageView =[[UIImageView alloc] initWithFrame:CGRectMake(i*100,0,100,100)];

        imageView.image= items[i];

        UIPanGestureRecognizer *pan1 = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction1:)];
        [imageView addGestureRecognizer:pan1];

        [self.view addSubview:imageView];


    }

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)panAction1:(UIPanGestureRecognizer *)sender imageView:(UIImageView*)imageView {

    CGPoint p = [sender translationInView:imageView];
    CGPoint movedPoint1 = CGPointMake(imageView.center.x + p.x, imageView.center.y + p.y);
    imageView.center = movedPoint1;
    [sender setTranslation:CGPointZero inView:self.view];

}
@end

UIPanGestureRecognizerクラスなどを使って、
imageView.userInteractionEnabled = YES;
とすれば動作するはずなのですが、この1行を書いてから
画像にタップすると
-[ViewController panAction1:]: unrecognized selector sent to instance 0x7fd815409080
となりアプリがクラッシュしてしまいます。

selectorのメソッドが参照できないからでしょうか?
解決方法がわかる方がいらっしゃいましたら教えてください。
お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

エラーが発生する原因は、selectorで指定したメソッドの引数の形式と実際のメソッドの引数があっていないからです。
panAction1メソッドは、次のように引数を宣言する必要があります。

- (void)panAction1:(UIPanGestureRecognizer *)sender {


imageViewは、panAction1メソッドの中で次のようにして取得すればいいです。

UIImageView *imageView = (UIImageView *)sender.view;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/05 00:02

    ありがとうございます。
    下記のようにしましたところ、ビルドはできたもののエラーとなってしまいました。。。

    - (void)panAction1:(UIPanGestureRecognizer *)sender {

    UIImageView *imageView = (UIImageView *)sender.view;
    CGPoint p = [sender translationInView:imageView];
    CGPoint movedPoint1 = CGPointMake(imageView.center.x + p.x, imageView.center.y + p.y);
    imageView.center = movedPoint1;
    [sender setTranslation:CGPointZero inView:self.view];

    }

    エラー内容
    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[1]'

    for文の中にはUIImageViewをインスタンス化しなくても良いのでしょうか?

    キャンセル

  • 2018/11/05 01:07

    画像のファイル名が実際の画像と合ってない等の理由で画像が読み込めなくて配列にnilをセットしようとしてエラーになったんじゃないですか?

    キャンセル

  • 2018/11/05 01:10 編集

    あえて画像のファイル名を変えて試してみたら同じエラーが発生するのを確認しました。「attempt to insert nil object from objects[1]」ということは 「image2.png」の画像ファイルが存在してないとかファイル名が誤っているとかじゃないでしょうか?

    キャンセル

  • 2018/11/05 19:54

    動作しました!ファイル名が間違っていたようです。
    凡ミスに気づかず申し訳ございませんでした。
    3時間以上調べながらやっていましたが、TakeOne様の回答で簡単に解決しました!
    本当にありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る