UIViewをドラッグした後、元の位置に戻す
UIViewをドラッグさせる
touchesBeganやtouchesMovedでもできそうですが、今回は「UIPanGestureRecognizer」を使ってみました。
self.snapView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width/2, self.view.bounds.size.height/2)]; self.snapView.center = self.view.center; self.snapView.backgroundColor = [UIColor blueColor]; [self.view addSubview:self.snapView]; UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragged:)]; [self.snapView addGestureRecognizer:panGesture];
Viewを作って画面の真ん中に配置させます。
そしてUIPanGestureRecognizerでジェスチャーをViewに登録します。
ジェスチャー(今回はドラッグ)されたときの処理をactionに指定。
-(void)dragged:(UIPanGestureRecognizer*) sender{ if(sender.state == UIGestureRecognizerStateEnded){ [self snap]; }else{ UIView *draggedView = sender.view; CGPoint delta = [sender translationInView:draggedView]; CGPoint movedPoint = CGPointMake(draggedView.center.x + delta.x, draggedView.center.y + delta.y); draggedView.center = movedPoint; [sender setTranslation:CGPointZero inView:draggedView]; } }
「translationInView:」で元の位置との相対位置を取得します。
そこから移動先の真ん中の座標を割り出し、Viewの位置を変更します。
これで、Viewをドラッグする処理ができました。
特定の位置に吸い付かせる
「UISnapBehavior」を使って、元いた位置に戻してみます。
-(void)snap{ [self.animator removeBehavior:self.snapBehavior]; CGPoint centerPoint = CGPointMake(self.view.center.x, self.view.center.y); self.snapBehavior = [[UISnapBehavior alloc] initWithItem:self.snapView snapToPoint:centerPoint]; [self.animator addBehavior:self.snapBehavior]; }
「snapToPoint」で指定した場所に吸い付くように移動します。
さきほどのジェスチャーにて、「UIGestureRecognizerStateEnded」でドラッグが終わったあとに上記のSnapの処理がはしるようにすれば完成。