UIViewをユーザーが移動できるようにしたいが、4つのコーナーのいずれか(ユーザーの最終タッチに最も近いもの)に移動する - FaceTimeのウィンドウ。私を助ける既存の方法はありますか?または、ユーザーの最後の位置と4つのコーナーの間の距離を手動で計算し、最も近いものに移動するようにアニメーションする必要がありますか?UIViewをユーザーがドラッグした後の4つの場所の1つに固定
0
A
答えて
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の場合は左、またはその逆
関連する問題
- 1. 1つのdivが固定された4つのdivの列レイアウト
- 2. ドラッグして1つの場所で2つの画像を使用する
- 3. 1つの場所ID
- 4. 固定間隔の後に緯度の場所を取得
- 5. 固定列幅が1つのFlexbox
- 6. ユーザーの場所を見つける
- 7. 4つの異なる場所から1つの場所にデータをバックアップするために、C#でウィンドウのサービスを開発しますか?
- 8. スウィフト - シェイクモーションが終了した後に場所を見つける
- 9. 他のUIViewがスワイプされたときに1つのUIViewでユーザーの操作を無効にする
- 10. ユーザーが指定したダウンロード場所
- 11. サブビュー内のオブジェクトを場所に固定
- 12. 一度に1つの場所でルートパスを定義する
- 13. 1つの場所でダブル2をインポート
- 14. 4つのプレハブを4つの場所でインスタント化、シャッフル、Unity Engine C#
- 15. iOSコアの場所の設定viewDidLoadのユーザーの位置に固定する
- 16. 2つの固定点の間のUIViewのスライディング
- 17. MapReduceジョブの場合、コアが4つのマシンを1つ使用していて、コアが1つのマシンを4つ使用していますか?
- 18. 場所:1つの特定のトリガーでヘッダーが機能しない
- 19. GWT複数のアクティビティ/ 1つのトークンを持つ場所
- 20. 2つのform_openを1つの場所codeigniter
- 21. ブートストラップ4 - 固定マージンを持つスティッキーNavbar
- 22. IdentityServer 4とスコープ固有のユーザー設定
- 23. phpどのようにユーザーが来た場所を見つけるには?
- 24. 3 div、1つの固定幅
- 25. カフカレプリカの1つがダウンした場合
- 26. 場所を見つける私の場所から180度(南)に1キロメートル
- 27. 1つのタイプのデータを別の場所に渡す(改造)
- 28. VBA - 任意のユーザーのワークシート固有の場所を保存
- 29. touchesBeganの後に作成されたUIViewをドラッグする
- 30. 最後の投稿またはモバイルの場所を経由してリアルタイムのユーザーの場所にアクセスする
うーん、私はそれはそれを行うための最善の方法かどうかわからない - クラスの目的は、これらの動きが現実的に見えるようにすることのようです。私はきれいな翻訳がほしいだけです。過度のことかもしれない。スーパークール! – user101
誰かがボタンを十分に軽くたたくと、私はそれを(それが境界線の前に置いていても)それをフリックした方向にずっと移動したい。 UIGravityBehaviorがこれを正しく処理できると思いますか? – user101
私はそう思います。試してみてください:) –