[解決済み] UIPanGestureRecognizer - 縦のみ、横のみ
2022-04-27 18:13:25
質問
ビューに
UIPanGestureRecognizer
を使用して、ビューを垂直にドラッグします。そのため、recognizerコールバックでは、y座標のみを更新して移動させています。このビューのスーパービューには
UIPanGestureRecognizer
を使用すると、x 座標を更新するだけで、ビューを水平方向にドラッグできます。
問題は、最初の
UIPanGestureRecognizer
はビューを縦に移動するイベントを取っているので、スーパービュージェスチャーを使うことができません。
私が試したのは
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:
(UIGestureRecognizer *)otherGestureRecognizer;
で、どちらも動作しますが、私はそれを望んでいません。明らかに水平方向の動きである場合にのみ、水平を検出させたいのです。だから、もし
UIPanGestureRecognizer
には、direction プロパティがあります。
この動作を実現するにはどうすればよいのでしょうか?私はドキュメントが非常にわかりにくいと思うので、多分誰かがここでもっとうまく説明することができます。
どのように解決するのですか?
UIPanGestureRecognizer のサブクラスを作成することで解決しました。
DirectionPanGestureRecognizerです。
#import <Foundation/Foundation.h>
#import <UIKit/UIGestureRecognizerSubclass.h>
typedef enum {
DirectionPangestureRecognizerVertical,
DirectionPanGestureRecognizerHorizontal
} DirectionPangestureRecognizerDirection;
@interface DirectionPanGestureRecognizer : UIPanGestureRecognizer {
BOOL _drag;
int _moveX;
int _moveY;
DirectionPangestureRecognizerDirection _direction;
}
@property (nonatomic, assign) DirectionPangestureRecognizerDirection direction;
@end
DirectionPanGestureRecognizer.m。
#import "DirectionPanGestureRecognizer.h"
int const static kDirectionPanThreshold = 5;
@implementation DirectionPanGestureRecognizer
@synthesize direction = _direction;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesMoved:touches withEvent:event];
if (self.state == UIGestureRecognizerStateFailed) return;
CGPoint nowPoint = [[touches anyObject] locationInView:self.view];
CGPoint prevPoint = [[touches anyObject] previousLocationInView:self.view];
_moveX += prevPoint.x - nowPoint.x;
_moveY += prevPoint.y - nowPoint.y;
if (!_drag) {
if (abs(_moveX) > kDirectionPanThreshold) {
if (_direction == DirectionPangestureRecognizerVertical) {
self.state = UIGestureRecognizerStateFailed;
}else {
_drag = YES;
}
}else if (abs(_moveY) > kDirectionPanThreshold) {
if (_direction == DirectionPanGestureRecognizerHorizontal) {
self.state = UIGestureRecognizerStateFailed;
}else {
_drag = YES;
}
}
}
}
- (void)reset {
[super reset];
_drag = NO;
_moveX = 0;
_moveY = 0;
}
@end
これは、ユーザーが選択した動作でドラッグを開始した場合にのみ、ジェスチャーをトリガーします。direction プロパティを正しい値に設定すれば、準備は完了です。
関連
-
制御が非ボイド関数の終了に達する
-
IOSラーニングノート「このクラスはxxxのキーバリューコーディングに対応していません」問題解決
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] Xcodeにおけるバージョンとビルドの比較
-
[解決済み] Xcode 6のバグ:Interface Builderファイル内の不明なクラス
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] アプリのプレビュー用にiOSシミュレータのビデオをキャプチャー
-
[解決済み] UILabelで複数行のテキストを表示する
-
[解決済み] Swift で HTTP リクエストを行うにはどうしたらいいですか?
-
[解決済み] UIImageのサイズを変更する最も簡単な方法?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
libc++abi.dylib が NSException 型の捕捉できない例外で終了する理由 エラー
-
JenkinsがIOSを自動パッケージングしてモミを配布
-
[解決済み] iOS 8 UITableViewのセパレータインセット0が機能しない件
-
[解決済み] NSの接頭辞はどういう意味ですか?
-
[解決済み] UIViewController のビューが表示されているかどうかを確認する方法
-
[解決済み] UITextFieldのテキスト変更イベント
-
[解決済み] Unwind segueは何に使うのか、どう使うのか?
-
[解決済み] UITextViewのマージン/パディングをなくす方法
-
[解決済み] SwiftでURLから画像を読み込む/ダウンロードする
-
[解決済み] セキュリティで保護されたWebサービスにもアクセスするiOSアプリで、Facebook認証を行うためのデザイン