2016-11-18 4 views
0

UIViewをユーザーが移動できるようにしたいが、4つのコーナーのいずれか(ユーザーの最終タッチに最も近いもの)に移動する - FaceTimeのウィンドウ。私を助ける既存の方法はありますか?または、ユーザーの最後の位置と4つのコーナーの間の距離を手動で計算し、最も近いものに移動するようにアニメーションする必要がありますか?UIViewをユーザーがドラッグした後の4つの場所の1つに固定

答えて

1

この方法は、最も近いビューをアニメーション化スーパービューの角です...

- (void)pinToCorner:(UIView *)view { 
    CGPoint parentCenter = view.superview.center; 
    CGPoint viewCenter = view.center; 

    CGSize parentSize = view.superview.bounds.size; 
    CGSize viewSize = view.bounds.size; 

    CGPoint targetOrigin; 

    if (viewCenter.x < parentCenter.x && viewCenter.y < parentCenter.y) { 
     // top left 
     targetOrigin = CGPointMake(0, 0); 
    } else if (viewCenter.x < parentCenter.x && viewCenter.y >= parentCenter.y) { 
     // bottom left 
     targetOrigin = CGPointMake(0, parentSize.height-viewSize.height); 
    } else if (viewCenter.x >= parentCenter.x && viewCenter.y < parentCenter.y) { 
     // top right 
     targetOrigin = CGPointMake(parentSize.width-viewSize.width, 0); 
    } else if (viewCenter.x >= parentCenter.x && viewCenter.y >= parentCenter.y) { 
     // bottom right 
     targetOrigin = CGPointMake(parentSize.width-viewSize.width, parentSize.height-viewSize.height); 
    } 
    CGRect frame = view.frame; 
    frame.origin.x = targetOrigin.x; 
    frame.origin.y = targetOrigin.y; 

    [UIView animateWithDuration:0.5 animations:^{ 
     view.frame = frame; 
    }]; 
} 

ドラッグが完了した後、パラメータとしてドラッグビューでこれを呼び出します。 FYI

、それをテストする完全なクラス...

@interface ViewController() 
@property(assign,nonatomic) CGPoint dragOrigin; 
@end 

@implementation ViewController 

// lazy button creator 
- (UIButton *)button { 
    UIButton *button = (UIButton *)[self.view viewWithTag:32]; 
    if (!button) { 
     button = [UIButton buttonWithType:UIButtonTypeSystem]; 
     button.tag = 32; 
     [button setTitle:@"Click Me" forState:UIControlStateNormal]; 
     [button addTarget:self action:@selector(tapped:) forControlEvents:UIControlEventTouchUpInside]; 
     button.frame = CGRectMake(0, 0, 80, 40); 
     button.center = self.view.center; 
     [self.view addSubview:button]; 

     UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panned:)]; 
     [button addGestureRecognizer:pan]; 
    } 
    return button; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self button]; 
} 

- (void)tapped:(id)sender { 
    NSLog(@"Tapped"); 
} 

- (void)panned:(UIPanGestureRecognizer *)gr { 
    if (gr.state == UIGestureRecognizerStateBegan) { 
     self.dragOrigin = gr.view.center; 
    } else if (gr.state == UIGestureRecognizerStateChanged) { 
     CGPoint translation = [gr translationInView:gr.view]; 
     gr.view.center = CGPointMake(self.dragOrigin.x + translation.x, self.dragOrigin.y + translation.y); 
    } else if (gr.state == UIGestureRecognizerStateEnded) { 
     [self pinToCorner:[self button]]; 
    } 
} 

// pinToCorner implementation from above goes here 
1

あなたはUIGravityBehaviorのでUIDynamicAnimatorを使うことができます。 hereは良いチュートリアルですが、どのように設定することができますか、要は、ビューの中心に応じて、側面にUIGravityBehaviorを追加することができます。

は、例えば、ユーザがYで<高さ/ 2を移動終了した場合、あなたは上側に動作を追加、またはX <幅/ 2の場合は左、またはその逆

+0

うーん、私はそれはそれを行うための最善の方法かどうかわからない - クラスの目的は、これらの動きが現実的に見えるようにすることのようです。私はきれいな翻訳がほしいだけです。過度のことかもしれない。スーパークール! – user101

+0

誰かがボタンを十分に軽くたたくと、私はそれを(それが境界線の前に置いていても)それをフリックした方向にずっと移動したい。 UIGravityBehaviorがこれを正しく処理できると思いますか? – user101

+0

私はそう思います。試してみてください:) –

関連する問題