[iPhone][Objective-C]UIViewをタッチしながら動かす方法
スタンプを貼る動作があるアプリの場合、
画像を選択して、画面をタッチしたあとそのまま動かしたり、
いったん手を話してからまた動かせるようなものがあります。
いろいろな処理と組み合わさって複雑になってくると大変ですが、
基本的な部分は同じです。
UIViewのtransformプロパティを使います。
画像を選択して、画面をタッチしたあとそのまま動かしたり、
いったん手を話してからまた動かせるようなものがあります。
いろいろな処理と組み合わさって複雑になってくると大変ですが、
基本的な部分は同じです。
UIViewのtransformプロパティを使います。
スタンプを貼り付けたいViewの下記3つのメソッドを編集します。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
まずプロパティでスタンプをひとつ作っておきます。
スタンプを貼り付けたいViewを初期化するときに一緒に初期化。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
まとめ
Viewの3つのメソッド、
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
これらをちょっといじるだけで簡単にスタンプを動かすことができるようになりました。
今回は非常にシンプルに実装しましたが、配列などを使うともっと便利に運用できるかもしれないです。
また、貼り付けるスタンプのVIewもクラスを作っておいて、
置いたあとに再度動かすことができるようにしたりすると完成度が高くなりますね。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
まずプロパティでスタンプをひとつ作っておきます。
@property (nonatomic, retain) UIImageView *stampUIImageView;
スタンプを貼り付けたいViewを初期化するときに一緒に初期化。
UIImageView *stampUIImageView = [[[UIImageView alloc] init] autorelease];
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
// ユーザによりViewへのタッチが開始したときに呼び出されるメソッド
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
// ユーザがタッチした座標を取得
CGPoint point = [((UITouch*)[touches anyObject])locationInView:self];
// stamp画像を取得
UIImage *stampUIImage = [UIImage imageNamed:@"Sample.png"];;
// スタンプを表示するViewのサイズや大きさを調整
self.stampUIImageView.image = pliclaUIImage;
self.stampUIImageView.frame = CGRectMake(point.x - stampUIImage.size.width/2 ,
point.y - stampUIImage.size.height/2,
stampUIImage.size.width,
stampUIImage.size.height);
[self addSubview:stampUIImageView];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
// ユーザがドラッグしたときに呼び出されるメソッド
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
// ユーザがドラッグした座標を取得
CGPoint point = [((UITouch*)[touches anyObject])locationInView:self];
// ドラッグ中の座標を使って移動
self.stampUIImageView.transform = CGAffineTransformMakeTranslation(point.x - self.stampUIImageView.center.x ,
point.y - self.stampUIImageView.center.y);
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
// ユーザがタッチを終了したときに呼び出されるメソッド
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
// ユーザがドラッグを終了した座標を取得
CGPoint point = [((UITouch*)[touches anyObject])locationInView:self];
// 今回はstampUIImageViewをプロパティとして持っていたので、それを別のViewに移す
// はじめに配列を用意して、そこへどんどんViewを追加していき、スタンプが貼り付けられるViewでは常に一番新しいViewだけを今までの処理で使うのも良いかもしれない
// 配列を用いた方が最後にすべて重ねあわせて一枚の画像にする際にもforで回せるため便利かもしれない
UIImageView *touchEndImageView = [[[UIImageView alloc] init] autorelease];
touchEndImageView.image = self.stampUIImageView.image;
touchEndImageView.frame = self.stampUIImageView.frame;
[self addSubview:touchEndImageView];
// いらなくなったViewをリムーブ
[self.stampUIImageView removeFromSuperview];
}
まとめ
Viewの3つのメソッド、
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
これらをちょっといじるだけで簡単にスタンプを動かすことができるようになりました。
今回は非常にシンプルに実装しましたが、配列などを使うともっと便利に運用できるかもしれないです。
また、貼り付けるスタンプのVIewもクラスを作っておいて、
置いたあとに再度動かすことができるようにしたりすると完成度が高くなりますね。
iPhoto - Apple 
