4

我在我的 iPhone 应用程序中看到状态栏上有一个可以访问通知中心的手势。如何在我的应用程序中实现这种转换?我认为这是通过滑动手势识别器完成的,但是如何包含从上到下的滑动手势(如何将通知中心拖动到其完整过渡)?是否有任何示例代码或可以帮助我做到这一点的东西?提前谢谢

4

3 回答 3

11

应该很容易做到。假设您有一个UIView( mainView) ,您想从中触发下拉事件。

  1. 将子视图 ( pulldownView) 放在可见区域的顶部外部的 mainView 上。
  2. 实施touchesBeganmainView检查触摸是否在前 30 个像素(或点)中。
  3. 实施touchesMoved您检查的位置,如果移动方向向下pulldownView且不可见,则将pulldownView向下拖动到主视图的可见区域或检查移动方向是否向上且pulldownView可见,如果是向上推出可见区域。
  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

此代码UIScrollView仅响应 460 像素以下的触摸。例如,如果您UIScrollView的高度为 800 像素,您可以将其从 460 像素触摸到 800 像素。足以打开、关闭和使用它。因此,如果您有一个全尺寸的UIScrollView,您可以将其向上拖动以打开它,同时您可以“触摸”底层视图。这种方法的好处是所有动画都依赖于默认行为,您不必自己实现它。

于 2013-01-08T10:07:23.847 回答