2016-03-30 6 views
1

Facebookアプリでは、アルバムの一部である写真を「覗く」と、指を横にスライドさせて他の写真に移動することができます。3Dタッチのピークとポップで、(Facebookのように)ピーク時にユーザーパンを検出するにはどうすればよいですか?

これはAPI内でどのように実行されますか?公開されているのは、View Controllerを提供し、そのView Controllerをポップ時にコミットすることだけです。

答えて

8

Peeking中にユーザーのタッチ位置を追跡できる小さなトリックがあります。

基本的には、覗き見を開始するときにユーザーのタッチ位置の追跡を開始し、ユーザーが表示コントローラーをポップしたり、タッチを解除したりするとトラッキングを終了するジェスチャー認識機能があります。ジェイク認識プログラムは、Peekを起動しているビューコントローラのビューに追加する必要があります。

Peeked View Controllerにアクセスできるため、そのView Controllerから、ユーザーのタッチ位置に相関する関数を呼び出すことができます。

だけで簡単にモックアップ:

@property (nonatomic, weak, nullable) ViewControllerClass *peekedVC; 

- (void)handleGestureRecognizer:(UIPanGestureRecognizer *)gr { 
    if (peekedVC && gr.state == UIGestureRecognizerStateChanged) { 
     CGPoint point = [gr locationInView:self.view]; 
     [peekedVC handle:point.x]; 
    } 
} 

- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext 
      viewControllerForLocation:(CGPoint)location { 
    NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:location]; 
    UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath]; 

    [previewContext setSourceRect:cell.frame]; 

    ViewControllerClass *vc = [ViewControllerClass new]; 
    self.peekedVC = vc; 
    return vc; 
} 

- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext 
commitViewController:(UIViewController *)viewControllerToCommit { 
    self.peekedVC = nil; 
    [self showViewController:viewControllerToCommit sender:self]; 
} 

私は実際にここにこの仕組みをカバーしてブログ記事を作っ: https://medium.com/behancetech/peek-pan-extending-3d-touch-f6520c38fe51#.4xz7lcm9o

ここにこれを統合することができますオープンソースプロジェクトでもあります: https://github.com/adobe-behancemobile/PeekPan

+1

上記のコードサンプルでカバーされていない重要な詳細の1つは、コントローラーがUIPanGestureRecognizerとretuの代理人として設定する必要があります'shouldRecognizeSimultaneouslyWithGestureRecognizer:'メソッドから 'rn' YES'を返します。 – BradB

関連する問題