みんなの「教えて(疑問・質問)」にみんなで「答える」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];
}
どなたか分かる方、教えて頂けますよう宜しくお願いします。
--------------------------------------------------------------------------------------------------------------

NSArray *initWithImage;と引数で渡しましたが、
「MyImageView* imageView = [[MyImageView alloc] initWithImage:imageList];」
の部分で、「Incompatible pointer sending 'NSMutableArray *' to parameter of type 'UIImage *'」とエラー表示され、実行すると、
「Tread1 : Program received signal: "SIGABRT"」で落ちてしまいます。

投稿日時 - 2011-06-15 20:34:54

QNo.6812032

すぐに回答ほしいです

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

こんばんは。なんか、つっこみどころ満載ですね。
たとえば、横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];

以上、参考にしてください。

投稿日時 - 2011-06-16 01:18:42

お礼

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

投稿日時 - 2011-06-20 20:27:31

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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;

こんな感じでしょうか。

投稿日時 - 2011-06-16 01:09:53

お礼

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

投稿日時 - 2011-06-20 20:25:31

あなたにオススメの質問