- 追加された行はこの色です。
- 削除された行はこの色です。
[[Programming]]
#contents
* 簡単なプログラム [#g4430f28]
背景に画像を設定し、その全面にクラゲを泳がせる
背景に画像を設定し、その前面にクラゲを泳がせる
View-Basedクラスを作成し ViewControllerクラスに以下の変数を追加
-View-Basedクラスを作成し ViewController.hファイルに以下の変数を追加
UIImageView *contentView;
UIImageView *fishes;
BOOL inSide;
CGPoint start;
UIImageView *contentView;//背景画像
UIImageView *fishes;//クラゲ画像
BOOL inSide;//クラゲ画像がタッチされたかどうかのフラグ
CGPoint start;//クラゲ画像の移動開始座標
またタッチメソッドを追加
-またタッチメソッドを追加
-(void) touchesBegan:(NSSet*) touches withEvent:(UIEvent*) event;
-(void) touchesMoved:(NSSet*) touches withEvent:(UIEvent*) event;
-(void) touchesEnded:(NSSet*) touches withEvent:(UIEvent*) event;
次に ControllerView.mを編集
-次に ControllerView.mを編集
ファイルの最初の方に以下を追加.
#import <QuartzCore/QuartzCore.h>
loadView関数を追加
- (void)loadView
{
//メインの画面矩形サイズを取得
//メインの画面矩形サイズを取得
CGRect appRect = [[UIScreen mainScreen] applicationFrame];
// その矩形サイズのビューを作成し
contentView = [[ UIView alloc] initWithFrame:appRect];
contentView.backgroundColor = [UIColor whiteColor];
// ControllerViewクラスのビューに代入
self.view = contentView;
[contentView release];
// 座標系を作成したビューにあわせる
appRect.origin = CGPointMake(0.0f,0.0f);
// 背景画像の準備
// 背景画像 kaitei.png の準備
UIImage* backgroundImage = [UIImage
imageNamed:@"kaitei2.png"];
// 背景にセット。なおこのファイル冒頭で
imageNamed:@"kaitei.png"];
// 画面Viewに背景画像をセット。なおこのファイル冒頭で
//#import <QuartzCore/QuartzCore.h> をincludeしておく
[contentView layer].contents = (id)backgroundImage.CGImage;
[backgroundImage release];
// 重ね合わせる画像の準備 .60ピクセル矩形の画像を画面
// 重ね合わせるクラゲ画像の準備.60ピクセル矩形の画像を画面
fishes = [[UIImageView alloc]
initWithFrame:CGRectMake(0.0f, 0.0f, 60.0f, 60.0f)];
//[fishes setUserInteractionEnabled:YES];
NSMutableArray *bflies = [[NSMutableArray alloc] init];
for (int i = 1; i <= 9; i++) {
NSString *cname = [NSString
stringWithFormat:@"kurage%d.png", i];
UIImage *img = [UIImage imageNamed:cname];
if (img) [bflies addObject:img];
[cname release];
}
// 画像をアニメーションさせる
// クラゲ画像をアニメーションさせる
[fishes setAnimationImages:bflies];
fishes.animationDuration = 2.0f;//0.75f
[fishes startAnimating];
[contentView addSubview:fishes];
[fishes release];
}
これで描画される。次に画像をドラッグして移動させる処理
-これで描画される。次に画像をドラッグして移動させる処理
//
-(void) touchesBegan:(NSSet*) touches withEvent:(UIEvent*) event
{
// タップ開始位置の取得
CGPoint pt2 = [[touches anyObject]
locationInView:contentView];
// その座標が、魚画像の矩形内か調べる
// その座標がクラゲ画像の矩形内か調べる
BOOL Y = CGRectContainsPoint(fishes.frame, pt2);
if(Y == YES){
inSide = YES;//フラグをセット
start = pt;
}else{
inSide = NO;
}
}
//
-(void) touchesMoved:(NSSet*) touches withEvent:(UIEvent*) event
{
if(inSide){//フラグがセットされているなら移動させる
UITouch * touch = [touches anyObject];
CGPoint pt = [touch locationInView:contentView];
// そして魚を移動する
// そしてクラゲ画像を移動する
CGRect frame = [fishes frame];
frame.origin.x = pt.x - start.x;
frame.origin.y = pt.y - start.y;
[fishes setFrame:frame];
}
}
////////
-(void) touchesEnded: (NSSet*)touches withEvent:(UIEvent*)event
{
inSide = NO;//Flag をアンセット
inSide = NO;//フラグをアンセット
}
* 参考ページ [#cc3bb392]
[[ここ:http://ameblo.jp/xcc/day-20090326.html]]がとても参考になる.
- (CGPoint)locationInView:(UIView *)view
locationInView:hogeは
指定したビュー hoge の座標系でレシーバ(タッチ)の現在の座標を返す。nilを指定した場合ウインドウの座標系になる。([[参照:http://profo.jp/wiki/index.php?UITouch#e2d7f1b0]])
これは hoge の現在の位置を,親ビューの座標系で返せ,ということか.
以下のループ構造でよく使われる.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
for (UITouch *touch in touches) {
clickPos = [touch locationInView:self];
break;
}
}
ビューの座標系については[[ここ:http://son-son.sakura.ne.jp/programming/iphone_setframe_setzposition_s.html]]が詳しい
また以下は[[ここ:http://d.hatena.ne.jp/Chabashira/20080322/1206175764]]からの引用.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// We only support single touches, so get the touch from allTouches
UITouch *touch = [[event allTouches] anyObject];
// Only move the placard view if the touch was in the placard view
if ([touch view] != placardView)
{
// In case of a double tap outside the placard view, update the placard's display string
if ([touch tapCount] == 2)
{
[placardView setupNextDisplayString];
}
return;
}
// Animate the first touch
CGPoint touchPoint = [self convertPoint:[touch locationInView:self] fromView:placardView];
[self animateFirstTouchAtPoint:touchPoint];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
// If the touch was in the placardView, move the placardView to its location
if ([touch view] == placardView)
{
CGPoint location = [touch locationInView:self];
location = [self convertPoint:location fromView:placardView];
placardView.center = location;
return;
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
// If the touch was in the placardView, bounce it back to the center
if ([touch view] == placardView)
{
// Disable user interaction so subsequent touches don't interfere with animation
self.userInteractionEnabled = NO;
[self animatePlacardViewToCenter];
return;
}
}