読者です 読者をやめる 読者になる 読者になる

NSBlogger

意識高いブログ

UIViewをドラッグした後、元の位置に戻す

objectivec

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の処理がはしるようにすれば完成。