4

iPhone アプリで、通知センターにアクセスできるステータス バーにジェスチャがあることを確認しました。アプリでその種のトランジションを実装するにはどうすればよいですか? これはスワイプ ジェスチャ レコグナイザで行われていると思いますが、上から下へのスワイプ ジェスチャを含めるにはどうすればよいですか (通知センターを完全なトランジションにドラッグする方法)。これを行うのに役立つサンプルコードまたは何かがありますか? 事前にタック

4

3 に答える 3

11

簡単にできるはずです。プルダウンをトリガーしたい ( ) があるとしますUIViewmainView

  1. サブビュー ( pulldownView) を mainView の上部の可視領域の外側に配置します。
  2. touchesBeganonを実装しmainViewて、タッチが上位 30 ピクセル (またはポイント) にあるかどうかを確認します。
  3. touchesMoved移動方向が下で表示されていない場合はチェックする場所を実装し、そうであれば下をメインビューの表示領域にpulldownViewドラッグするか、移動方向が上で表示されているかどうかを確認し、表示されている場合は表示領域から上に押し出します。pulldownViewpulldownView
  4. touchesEndがどちらの方向に移動したかを確認して、ドラッグまたはプッシュの移動を終了する場所を実装しますpulldownView

編集:

ここにいくつかのサンプルコードがあります。テストされておらず、タイプミスが含まれている可能性があり、コンパイルされない可能性がありますが、必要な本質的な部分が含まれている必要があります。

//... inside mainView impl:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  UITouch *touch = (UITouch *)[touches anyObject];
  start = [touch locationInView:self.superview].y;
  if(start > 30 && pulldownView.center.y < 0)//touch was not in upper area of view AND pulldownView not visible
  {
    start = -1; //start is a CGFloat member of this view
  }
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
  if(start < 0)
  {
    return;
  }
  UITouch *touch = (UITouch *)[touches anyObject];
  CGFloat now = [touch locationInView:self.superview].y;
  CGFloat diff = now - start;
  directionUp = diff < 0;//directionUp is a BOOL member of this view
  float nuCenterY = pulldownView.center.y + diff;
  pulldownView.center = CGPointMake(pulldownView.center.x, nuCenterY);
  start = now;
}


-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
  if (directionUp)
  {
    //animate pulldownView out of visibel area
    [UIView animateWithDuration:.3 animations:^{pulldownView.center = CGPointMake(pulldownView.center.x, -roundf(pulldownView.bounds.size.height/2.));}];
  }
  else if(start>=0)
  {
    //animate pulldownView with top to mainviews top
    [UIView animateWithDuration:.3 animations:^{pulldownView.center = CGPointMake(pulldownView.center.x, roundf(pulldownView.bounds.size.height/2.));}];
  }
}
于 2012-04-25T15:09:33.530 に答える
1

UISwipeGestureRecognizer を実装して、アプリでスワイプ ジェスチャを処理し、検出するスワイプの方向を UISwipeGestureRecognizerDirectionDown として指定できます。

ここにApple のサンプルがあります。一見の価値があるWWDC10 セッションもいくつかあります。そのページの「ジェスチャー認識機能を使用したタッチイベント処理の簡素化」と「高度なジェスチャー認識」をお勧めします

于 2012-04-25T15:00:02.333 に答える
0

UIViewフルサイズのサブクラスを使用するだけで、この問題を解決しましたUIScrollViewUIViewユーザーが「ドラッグ可能」ではないポイントに触れた場合、タッチイベントをその下にあるビューに渡します。

@implementation MyCustomUIView

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    // Check whether we are on the overlay
    if
    (
        point.y < 460.0f
        // Maybe some more restrictions here
    )
    {
        // Block the event, pass to parent
        return NO;
    }

    // Everything okay
    return YES;
}

@end

このコードは、UIScrollView460px未満のタッチにのみ応答します。たとえば、高さが800ピクセルの場合UIScrollView、460ピクセルから800ピクセルまでタッチできます。開閉して使用するのに十分です。したがって、フルサイズUIScrollViewの場合は、下にあるビューに「触れる」ことができる間、それを上にドラッグして開くことができます。この方法の利点は、すべてのアニメーションがデフォルトの動作を中継し、自分で実装する必要がないことです。

于 2013-01-08T10:07:23.847 に答える