[再]Objective-C 描画処理について

このQ&Aのポイント
  • iPhoneアプリを作成している初心者が、画像を並べてスクロールできるように描画処理を行いたいがうまくいかず、コードの一部でエラーが発生してしまう。
  • initWithImageメソッドに配列を渡した際に、パラメータの型が不適切とエラーが表示され、実行時にプログラムが落ちてしまう。
  • 解決策を教えていただける方を探しています。
回答を見る
  • ベストアンサー

[再]objective-c 描画処理について

前回質問させて頂きましたが、まだ抜け出せていないので教えて下さい。 ↓↓↓ -------------------------------------------------------------------------------------------------------------- 初心者ですが、iPhoneアプリを作成しています。 画像を並べてスクロールできるように配列で描画処理を行ないたいのですが、うまくいきません。 今のところのコードはこんな感じです↓ - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray* imageList = [NSMutableArray array]; for (int i=1; i < 20; i++) { UIImage* image = [UIImage imageNamed: [NSString stringWithFormat:@"%d.jpg", i+1]]; [imageList addObject:image]; } MyImageView* imageView = [[MyImageView alloc] initWithImage:imageList]; scrollView.contentSize = imageView.bounds.size; [scrollView addSubview:imageView]; [imageView release]; } どなたか分かる方、教えて頂けますよう宜しくお願いします。 -------------------------------------------------------------------------------------------------------------- ↓ NSArray *initWithImage;と引数で渡しましたが、 「MyImageView* imageView = [[MyImageView alloc] initWithImage:imageList];」 の部分で、「Incompatible pointer sending 'NSMutableArray *' to parameter of type 'UIImage *'」とエラー表示され、実行すると、 「Tread1 : Program received signal: "SIGABRT"」で落ちてしまいます。

質問者が選んだベストアンサー

  • ベストアンサー
  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.2

こんばんは。なんか、つっこみどころ満載ですね。 たとえば、横1列に画像を並べると仮定して。 (1) まず、画像のパスはNSBundleで取って来たらどうですか? 画像が3枚としたら、こんな感じで。 NSArray* photoFiles = [NSArray arrayWithObjects:@"1", @"2", @"3", nil]; for (NSString* photoName in photoFiles) { NSString* path = [[NSBundle mainBundle] pathForResource:photoName ofType:@"jpg"]; (2) scrollView.contentSize = imageView.bounds.size; これはおかしいでしょう。画像1枚分の広さしかない。 画像横3枚分の広さは、こんな感じでどうですか? CGRect photoPanel = CGRectMake(0, 0, photoW*3, photoH); scrollView.contentSize = photoPanel.size; (3) UIImageViewに画像パスを指定するには、こんな感じで aImageView.image = [UIImage imageWithContentsOfFile:path]; (4) 画像毎のUIImageViewの位置は、for文の中で横にずらせば いいでしょう CGRect imageBounds = CGRectMake(photoW*i, 0, photoW, photoH); UIImageView* aImageView = [[UIImageView alloc] initWithFrame:imageBounds]; (5) そして、スクロールビューに追加する [scrollView addSubview:aImageView]; [aImageView release]; 以上、参考にしてください。

eTakasy
質問者

お礼

何かと勉強不足で大変申し訳ありません。 xjdさんの回答を参考にさせて頂き、なんとか解決できました。 本当にありがとうございました。

その他の回答 (1)

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

私は、あなたの前の質問に対して、「問題があるとすると、ここに書かれていない箇所でしょう。MyImageViewの初期化メソッド「initWithImage:」が、どう定義されているかが、気になります。引数の型が、ちゃんと(NSArray *)になっていますか?」という質問で返しました。 この私の質問に答えてもらえませんか?私は、べつにここに雑談をしにきているわけではない。答えてもらっても、もらわなくても、どうでもいい質問をしているわけではなく、問題解決のために、どうしても必要な情報を導き出すという目的を持って、質問をしているのです。 私の質問を、箇条書きで整理しておきましょうか? (1) クラスMyImageViewの実装部を書いてください。 (2) とくに、初期化メソッド「initWithImage:」の定義を書いてください。 (3) さらに、「initWithImage:」の引数の型が知りたい。 おそらく「クラスMyImageViewに、初期化メソッドinitWithImage:は実装していない」という答えが返ってきそうな気はしています。 それは今回のあなたの質問で、新しく出された情報から推理ができるからです。 エラー表示「Incompatible pointer sending 'NSMutableArray *' to parameter of type 'UIImage *'」。 「(UIImage *)を型とする引数に対して、型が一致しないポインタである(NSMutableArray *)を送っている」のですから、Super Class(親クラス)の初期化メソッドは、こう定義されているはずです。 - (id) initWithImage: (UIImage *)image; そこへNSMutableArrayインスタンスを送ったら、そらエラーになりますよ。カツ丼の出前を頼んで、ピザを持ってこられたら、だれだって怒ります。 どうしてもUIImageの配列NS(Mutable)Arrayを渡して初期化したければ、MyImageViewに、そういう初期化メソッドを定義し、実装してください。ただし、Super Classのメソッド名とぶつからないよう、メソッド名は変えたほうがいいでしょうね。 - (id) initWithImageArray: (NSArray *)imageArray; こんな感じでしょうか。

eTakasy
質問者

お礼

何かと勉強不足で大変申し訳ありません。 ここで質問させて頂くこと事態、初めてだったもので、 回答者の方へ返答の仕方も分からなかったもので。。 時間はかかりましたが、この問題については解決できました。 本当にありがとうございました。

関連するQ&A

  • objective-c 描画処理について

    初心者ですが、iPhoneアプリを作成しています。 画像を並べてスクロールできるように配列で描画処理を行ないたいのですが、うまくいきません。 今のところのコードはこんな感じです↓ - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray* imageList = [NSMutableArray array]; for (int i=1; i < 20; i++) { UIImage* image = [UIImage imageNamed: [NSString stringWithFormat:@"%d.jpg", i+1]]; [imageList addObject:image]; } MyImageView* imageView = [[MyImageView alloc] initWithImage:imageList]; scrollView.contentSize = imageView.bounds.size; [scrollView addSubview:imageView]; [imageView release]; } どなたか分かる方、教えて頂けますよう宜しくお願いします。

  • Objective-C for文でのインスタンス

    既出の質問と類似してますが、解決しないので質問します。 Objective-CのNSMutableArrayを使いラベルを複数個作りならべたいのですが、 変数iを使ってラベルに番号をつける方法がわかりません。 今のコードは NSMutableArray *tiles = [NSMutableArray array]; for( int i=0; i<25; i++ ){ UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0,0, tileSize,tileSize)]; label.text=[NSString stringWithFormat:@"%d",i]; [tiles addObject:label]; [self.view addSubview:label]; } です。 これを UILabel *label%d,i = [[UILabel alloc]initWithFrame:CGRectMake(0,0, tileSize,tileSize)]; のようにして、 label0、lable1、label2、label3・・・・ というように生成するにはどうしたらいいですか? Objective-C初心者です。 よろしくお願いします。

  • Objective-c ボタンの動的配置

    ボタンを以下のように、動的に配置していますが、画像がぼやけて表示されてしまいます。 調べると、座標の指定が整数値でない場合、この問題が起こったりするようなのですが、 整数値にしても奇麗に表示されません。。 どなたか、お分かりになる方教えて下さい。 myButton = [UIButton buttonWithType:UIButtonTypeCustom]; UIImage *myImage = [UIImage imageNamed:[NSString stringWithFormat:@"test.png"]]; [myButton setImage:myImage forState:UIControlStateNormal]; [myButton] setFrame:CGRectMake(100,100,200,200)]; [myButton addTarget:self action:@selector(test:) forControlEvents:UIControlEventTouchUpInside]; [scrollView addSubview:myButton ];

  • objective-cで困っています教えてください

    下記のようにUIViewの上にUIImageViewを配置し、そこにUIImageをUIViewContentModeScaleAspectFitで表示させています。 表示している画像タップして、座標をとりたいと考えています。 UIImageView(UIImage)上だけをタップのエリアにしたいのですが、画面全体がタップのエリアになってしまいます。また、画像のアスペクト比を維持しUIImageViewサイズに収まるように表示しているので、タップでとれたUIImageView上の座標と、画像上の座標にズレができてしまいます。UIImageViewサイズに収まるように表示された画像上の位置から元の画像の座標を取得する方法を教えてください。 #import "ViewController.h" @interface ViewController (){ UIImageView *imageView; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. CGRect rect = CGRectMake(0,20, 360, 480); imageView = [[UIImageView alloc] initWithFrame:rect]; imageView.backgroundColor = [UIColor redColor]; //画像のアスペクト比を維持しUIImageViewサイズに収まるように表示 imageView.contentMode = UIViewContentModeScaleAspectFit; UIImage *image = [UIImage imageNamed:@"hoge.png"]; [imageView setImage:image]; [self.view addSubview:imageView]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } /** * タッチされたとき */ - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint p = [[touches anyObject] locationInView:imageView]; float x = p.x; // X座標 float y = p.y; // Y座標 NSLog(@"タップ開始 %f, %f", x, y); } @end

  • objective-cで困っています教えてください

    objective-cをトライ&エラーで試しながら学習をしている初心者です。タッチした所を中心にまず100×100の正方形を表示し、その後スライダーで正方形の大きさを決めてから画像のトリミングをしたいのですが、正方形が表示されないのと、タッチした位置と切り取られる位置がずれています。上記の内容で行き詰っており、知恵をお借りしたいと思い投稿しました。宜しくお願いします。 ViewController.mの内容 #import "ViewController.h" @interface ViewController (){ // UILabel *label; // UIImageView *uv; //中心の位置 float v; // X座標 float x; // Y座標 float y; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //写真の表示 CGRect rect_uv = CGRectMake(0,20, 360, 360); UIImageView *imageView = [[UIImageView alloc] initWithFrame:rect_uv]; //画像のアスペクト比を維持しUIImageViewサイズに収まるように表示 imageView.contentMode = UIViewContentModeScaleAspectFit; UIImage *image = [UIImage imageNamed:@"hoge.png"]; [imageView setImage:image]; [self.view addSubview:imageView]; // UISliderのインスタンス化 CGRect rect_sd = CGRectMake(50, 400, 200, 10); UISlider *slider = [[UISlider alloc]initWithFrame:rect_sd]; // スライダーの最小値,最大値,値を設定 slider.minimumValue = 0; slider.maximumValue = 500; slider.value = 100; // スライドしている最中に値を調べられるようにする.デフォルトでYESだがサンプルのため slider.continuous = YES; // スライダーの値が変更されたときに呼ばれるメソッドを設定 [slider addTarget:self action:@selector(slider_ValueChanged:) forControlEvents:UIControlEventValueChanged]; // スライダーをビューに追加 [self.view addSubview:slider]; // ラベルの設置 CGRect rect_lb = CGRectMake(300, 400, 100, 30); label = [[UILabel alloc]initWithFrame:rect_lb]; [self.view addSubview:label]; // 標準ボタン例文 UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(50, 450, 100, 30); [btn setTitle:@"切り取り" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(trim:) forControlEvents:UIControlEventTouchDown]; [self.view addSubview:btn]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } /** * スライダーの値が変更されたとき */ - (void)slider_ValueChanged:(id)sender { UISlider *slider = sender; // スライダーの値をログに記述 NSLog(@"スライダーの値:%f", slider.value); // ラベルのテキストを設定 //float v = slider.value; v = slider.value; label.text = [NSString stringWithFormat:@"%2.f",v]; //四角形を描画 CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得 CGContextStrokeRect(context, CGRectMake(x,y,v,v)); // 四角形の描画 } /** * タッチされたとき */ - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 1.anyObjectメソッドでいずれか1つのタッチを取得 // 2.locationViewメソッドで対象となるビューのタッチした座標を取得 CGPoint p = [[touches anyObject] locationInView:self.view]; x = p.x; // X座標 y = p.y; // Y座標 NSLog(@"タップ開始 %f, %f", x, y); //四角形を描画 CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得 CGContextStrokeRect(context, CGRectMake(x,y,100,100)); // 四角形の描画 } /** * 切り取りボタンが押されたとき呼ばれるtrimメソッド */ -(void)trim:(UIButton*)button{ // ここに何かの処理を記述する // (引数の button には呼び出し元のUIButtonオブジェクトが引き渡されてきます) // 切り抜き元となる画像を用意する。 //UIImage *srcImage = /* UIImagePickerなどから取得したUIImage */ UIImage *srcImage = [UIImage imageNamed:@"hoge.png"]; // 切り抜く位置を指定するCGRectを作成する。 CGRect trimArea = CGRectMake(x, y, v, v); // CoreGraphicsの機能を用いて、 // 切り抜いた画像を作成する。 CGImageRef srcImageRef = [srcImage CGImage]; CGImageRef trimmedImageRef = CGImageCreateWithImageInRect(srcImageRef, trimArea); UIImage *trimmedImage = [UIImage imageWithCGImage:trimmedImageRef]; // 画像表示例文 //UIImage *img = [UIImage imageNamed:@"hoge.png"]; UIImageView *iv = [[UIImageView alloc] initWithImage:trimmedImage]; [self.view addSubview:iv]; } @end

  • Objective-c  画面遷移について

    毎回、初歩的な質問内容で申し訳ありませんが、困っているので教えて下さい。 「FirstViewController」はUIScrollViewでスクロールさせている画面で、タッチイベントを取得する為に UIScrollView のサブクラスを作っています。 そこでタッチすると、「SecondViewController」へ固定の画面で遷移するようにしたいのですが、「SecondViewController」の画面もそのままスクロール画面で表示されてしまいます。。。 「SecondViewController」をスクロールさせず、位置x=0 y=0で表示させるにはどうしたら良いのでしょうか? 詳しく教えて頂けると、大変助かります。。 ↓FirstViewController.h↓ @interface FirstViewController : UIViewController{   MyScrollview *controller; IBOutlet UIScrollView *scrollView; } ↓FirstViewController.m↓ - (void)viewDidLoad { controller = [[ MyScrollview alloc] initWithFrame:CGRectMake(0, 0, 1100, 1100)]; self.view = controller; [super viewDidLoad]; [super loadView]; scrollView.contentSize = controller.frame.size; [scrollView addSubview:controller]; } ↓MyScrollview .h↓ @interface MyScrollview : UIView<UIScrollViewDelegate>{ } @end ↓MyScrollview .m↓ -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{ SecondViewController *svc; svc = [[SecondViewController alloc] init]; [self addSubview:[svc view]]; }

  • xcode 画像をランダムに並べ順番に押す

    初めてですが質問よろしくお願いします。 iphone開発初心者です。 数字の画像をランダムに5×5に並べ、1から25まで順番に押していく、 というアプリを制作中なのですが行き詰まっています。 現在下記コードのようになっています。 画像を表示まではできたのですが、下記3つ、できればソースコードをお聞きしたいです。 (1)画像25個をランダムに表示する記述がわかりません (今はとりあえずで同じ画像を1つ入れてます。(img1~img25のimg1を代入中)) (2)順番に押していく処理 (3)画像を押された時に音を出したい - (IBAction)image:(id)sender { AudioServicesPlaySystemSound(sound_1); } の部分をうまく入れこめばいいのかと思っていますが、その入れこみ方もわかりません。 AudioToolboxは追加済みです。 どなたかご教授よろしくお願いします。 #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSString *path = [[NSBundle mainBundle] pathForResource:@"btn_1" ofType:@"mp3"]; NSURL *url = [NSURL fileURLWithPath:path]; AudioServicesCreateSystemSoundID((CFURLRef)CFBridgingRetain(url), &sound_1); int yo = 5; for(int i = 0;i<yo; i++){ UIImageView *imageView = [UIImageView new]; imageView.frame = CGRectMake(15+60*i, 100, 60, 60); imageView.image = [UIImage imageNamed:@"img1.png"]; [self.view addSubview:imageView]; } int f = 25; for(int i = 0;i<f; i++){ UIImageView *imageView = [UIImageView new]; imageView.frame = CGRectMake(15+60*(i%5), 100+60*(i/5), 60, 60); imageView.image = [UIImage imageNamed:@"img1.png"]; [self.view addSubview:imageView]; } int rand = arc4random()%f; for(int i = 0; i<f; i++){ if(i == rand){ UIButton*button = [UIButton new]; button.frame = CGRectMake(15+60*(i%5), 100+60*(i/5), 60, 60); [button setImage:[UIImage imageNamed:@"img1.png"] forState:UIControlStateNormal]; [button addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchDown]; [self.view addSubview:button]; }else{ UIImageView *imageView = [UIImageView new]; imageView.frame = CGRectMake(15+60*(i%5), 100+60*(i/5), 60, 60); imageView.image = [UIImage imageNamed:@"img1.png"]; [self.view addSubview:imageView]; } } } - (IBAction)image:(id)sender { AudioServicesPlaySystemSound(sound_1); } -(void)buttonTapped{ } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end

  • ボタンのtagの番号を値渡しする方法について

    今、xcodeでiphoneやipad用のアプリを作っています。 VIewController(VC)に30個くらいのボタンを置き、そのボタンのタグ番号に合わせて、SecondVIewContorller(SVC)で、画像がでてきて、それをタップしたら、次の画像へ移動するというようにしたいのですが、VCのボタンのタグ番号をSVCに送ろうとするところでひっかかっています。もし何かご助言が頂けたら誠に幸いです。よろしくお願いします。 以下、自分なりにつくったコードです。 <VCの実装> - (IBAction)pushBtn:(UIButton *)sender { [self performSegueWithIdentifier:@"mySegue" sender:self];} -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if([segue.identifier isEqualToString:@"mySegue"]){ secondViewController*viewcon=segue.destinationViewController; viewcon.Number=[NSString stringWithFormat:@"%d",[sender tag]]; } これをSVCに送ってタグ番号をつけたいのですが、 以下の上から五行目のところの書き方のところでエラーがでてますが、他の書き方が わかりません。 <SVCの実装> - (void)viewDidLoad { [super viewDidLoad]; UIImage*imageDate=[UIImage imageNamed:@"%d,png",_Number]; CGRect rect=CGRectMake(0,0 ,200,200); UIImageView*imageView=[[UIImageView alloc]initWithFrame:rect]; imageView.image=imageDate; imageView.contentMode=UIViewContentModeScaleAspectFit; imageView.center=self.view.center; [self.view addSubview:imageView];} xcodeのバージョンは、5,0です。 重ね重ねよろしくお願いします。

  • objectiv-cで困っています。教えてください

    objectiv-cの勉強を始めてばかりです。いろいろ調べながら、カメラロールから画像を選択して、表示させようとしてます。配列NSArrayに入っている "<UIImage: 0x7fbbdae55b10>", "<UIImage: 0x7fbbdaf68e00>", "<UIImage: 0x7fbbdaf69430>", "<UIImage: 0x7fbbdac79aa0>", "<UIImage: 0x7fbbdae8d690>" を一つずつ取り出してMain.storyboardに配置したIBOutlet UIImageView *imageView;に表示させようとしているのですが、表示できません。 UIImage *img = [[UIImage alloc] initWithImage:配列の番号]; imageView.image = img; 「initWithImage:配列の番号」のところがおかしいのでしょうか?0x7fbbdae8d690などの文字列はカメラロールの画像へのパスですか? まだまだ初心者で質問もおかしいところがあるかも知れませんが、回答よろしくお願いします。

  • iPhoneアプリプログラミング

    iPhoneアプリ開発超初心者です。 「逆引きObjective-C for iPhoneアプリ」というサイトの中の http://www.objectivec-iphone.com/UIKit/UIImageView/UIImageView.html に、画像を表示するサンプルプログラムとして - (void)viewDidLoad { [super viewDidLoad]; // UIImageViewの初期化 CGRect rect = CGRectMake(10, 10, 250, 250); UIImageView *imageView = [[UIImageView alloc]initWithFrame:rect]; // 画像の読み込み imageView.image = [UIImage imageNamed:@"lena.png"]; // UIImageViewのインスタンスをビューに追加 [self.view addSubview:imageView]; } が紹介されているのですが、 メソッド - (IBAction)executeView:(id) sender {   // 画像表示 } の中で、画面上の特定位置への画像表示を指定する方法を教えてください。 上記のサンプルプログラムとメソッドを組み合わせるようなことをするのでしょうか? なにぶん超初心者で的外れなことを言っているかもしれませんが、よろしくお願いします。

専門家に質問してみよう