web-dev-qa-db-ja.com

iOSメールに似たUITableViewセルで左から右へのスワイプを実装する方法

メールアプリ内で左から右にスワイプしたときにメールを未読または「未読としてマーク」するために、メールアプリでAppleが使用するものと同じテクニックを複製しようとしています。

Screenshot of Mail inside iOS 8.1 Mail app

similarsolutions が見つかりましたが、右から左にスワイプするジェスチャのみです。この同じソリューションが、Apple SDKの反対方向の一部として利用できることを望んでいました。

iOSのメールアプリと同じ左から右へのジェスチャー効果を実現するにはどうすればよいですか?

24
gh0st

同様の解決策を見つけましたが、右から左にスワイプするジェスチャーのみです右から左に。

SWTableViewCell には、必要なすべてのオプションがあります。

セルのキューイング中に、必要に応じてボタンの左右セットを設定します。

cell.leftUtilityButtons = [self leftButtons];
cell.rightUtilityButtons = [self rightButtons];
cell.delegate = self;

また、View Controllerをデリゲートとして設定することにより、ボタンのクリック音を聞くことができます。実装方法の詳細は、そのリンクにあります

例1:

enter image description here

例2: enter image description here

縦に積み重ねられたボタンを探している場合は、 this を確認してください。

28
GoodSp33d

通常、テーブルレベルで実装します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self
                                                                                  action:@selector(leftSwipe:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
    [self.tableView addGestureRecognizer:recognizer];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self
                                                        action:@selector(rightSwipe:)];
    recognizer.delegate = self;
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
    [self.tableView addGestureRecognizer:recognizer];
}

その後、方向を制御し、自由にカスタマイズできます

- (void)leftSwipe:(UISwipeGestureRecognizer *)gestureRecognizer
{
    //do you left swipe stuff here. 
}

- (void)rightSwipe:(UISwipeGestureRecognizer *)gestureRecognizer
{
    //do you right swipe stuff here. Something usually using theindexPath that you get that way
    CGPoint location = [gestureRecognizer locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];
}

クレジットは Jade Mind

20
GrandSteph

指定したリンクで受け入れられた回答は、両方のスワイプ方向に対するものです。
通知gestureRecognizer.directionは、YESUISwipeGestureRecognizerDirectionLeftの両方に対してUISwipeGestureRecognizerDirectionRightを返します。

いくつかのことを変更するだけです。
スワイプ時に呼び出されるセレクターを変更し、投稿の例にあるメソッドの代わりにメソッドを呼び出すようにします。
スワイプの方向を左から右のみに変更し、現在の両方向ではなく、私が理解しているように、あなたは一方向のスワイプを設定しようとしているためです。

したがって、コードは次のようになります。

// In cellForRowAtIndexPath:, where you create your custom cell  
cell.tableView=tableView;  
cell.indexPath=indexPath;
UISwipeGestureRecognizer *swipeGestureRecognizer=[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(YOUR_METHOD_GOES_HERE)];
[cell addGestureRecognizer:swipeGestureRecognizer];  

-(BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {  
    if([[gestureRecognizer view] isKindOfClass:[UITableViewCell class]] && ((UISwipeGestureRecognizer*)gestureRecognizer.direction==UISwipeGestureRecognizerDirectionRight)  
        return YES;  
}

また、受け入れられた回答の下にある回答を使用し、ジェスチャー認識機能のdirectionプロパティを、例の現在の方向であるUISwipeGestureRecognizerDirectionRightではなく、UISwipeGestureRecognizerDirectionLeftに変更することもできます。

これを実装することを選択した場合、viewControllerはジェスチャー認識デリゲートを実装する必要があり、コードは次のようになります。

// Call this method in viewDidLoad  
- (void)setUpLeftSwipe {  
    UISwipeGestureRecognizer *recognizer;  
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self
                                                   action:@selector(swipeRightt:)];  
    [recognizer setDirection:UISwipeGestureRecognizerDirectionRight];  
    [self.tableView addGestureRecognizer:recognizer];  
    recognizer.delegate = self;  
}  


- (void)swipeRight:(UISwipeGestureRecognizer *)gestureRecognizer {  
    CGPoint location = [gestureRecognizer locationInView:self.tableView];  
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];  
    ... do something with cell now that i have the indexpath, maybe save the world? ...  
}  

注-間違っていない場合は、セルをスワイプするアニメーションを自分で作成する必要があります。Xcodeのデフォルトのセルアニメーションは左にスワイプしたときだけだと思います。

クレジットは、指定したリンクからMadhavanRPおよびJulianに割り当てられます。私はあなたのニーズに合わせて彼らの答えを修正しました。
自分でこれを試したり実装したりしていません。

2
AMI289