Iphone 在iOS 5中向下拖动UIView

Iphone 在iOS 5中向下拖动UIView,iphone,objective-c,cocoa-touch,ios5,uigesturerecognizer,Iphone,Objective C,Cocoa Touch,Ios5,Uigesturerecognizer,我在我的iPhone应用程序中看到,状态栏上有一个可以访问通知中心的手势。我如何在我的应用程序中实现这种转换?。我认为这是通过滑动手势识别器完成的,但是如何将滑动手势从上到下包括在内(如何将通知中心拖过其完整转换)?是否有任何示例代码或其他东西可以帮助我做到这一点? Thaks Prevance您可以实现UISweepGestureRecognitzer来处理应用程序中的滑动手势,并指定滑动方向以检测为UISweepGestureRecognitzerDirectionDown 这里有一个。还有

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

您可以实现UISweepGestureRecognitzer来处理应用程序中的滑动手势,并指定滑动方向以检测为UISweepGestureRecognitzerDirectionDown


这里有一个。还有一些值得一看。我建议“使用手势识别器简化触摸事件处理”和来自的“高级手势识别”应该很容易做到。假设您有一个
UIView
mainView
),您希望从中触发下拉操作

  • 将子视图(
    下拉视图
    )放在可见区域外的主视图顶部
  • mainView
    上执行
    touchsbegined
    ,并检查触摸是否在前30个像素(或点)内
  • 在您检查的位置执行
    触摸移动
    ,如果移动方向向下且
    下拉视图
    不可见,如果是,则将
    下拉视图
    向下拖动到主视图的可见区域,或者检查移动方向是否向上且
    下拉视图
    可见,如果是,则将其向上推出可见区域
  • 执行
    touchesEnd
    ,通过检查
    下拉视图的移动方向来结束拖动或推动移动
  • 编辑:

    下面是一些示例代码。未经测试,可能包含打字错误,可能不会编译,但应包含所需的基本部分

    //... 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.));}];
      }
    }
    
    /。。。内部mainView impl:
    -(无效)触摸开始:(NSSet*)触摸事件:(UIEvent*)事件
    {
    UITouch*触摸=(UITouch*)[触摸任何对象];
    开始=[touch locationInView:self.superview].y;
    if(start>30&&pulldownView.center.y<0)//触摸不在视图的上部区域,且pulldownView不可见
    {
    start=-1;//start是此视图的CGFloat成员
    }
    }
    -(无效)触摸移动:(NSSet*)触摸事件:(UIEvent*)事件
    {
    如果(开始<0)
    {
    返回;
    }
    UITouch*触摸=(UITouch*)[触摸任何对象];
    CGFloat now=[touch locationInView:self.superview].y;
    CGFloat diff=现在-开始;
    directionUp=diff<0;//directionUp是此视图的BOOL成员
    float numcentery=下拉视图.center.y+diff;
    pulldownView.center=CGPointMake(pulldownView.center.x,numcentery);
    开始=现在;
    }
    -(void)touchesend:(NSSet*)toucheevent:(UIEvent*)event
    {
    如果(方向向上)
    {
    //为visibel区域外的下拉视图设置动画
    [UIView animateWithDuration:.3个动画:^{pulldownView.center=CGPointMake(pulldownView.center.x,-roundf(pulldownView.bounds.size.height/2.);}];
    }
    否则如果(开始>=0)
    {
    //使用从上到主视图的方式设置下拉视图的动画
    [UIView animateWithDuration:.3个动画:^{pulldownView.center=CGPointMake(pulldownView.center.x,roundf(pulldownView.bounds.size.height/2.);}];
    }
    }
    
    我通过在全尺寸的
    uicrollview
    中使用子类的
    UIView
    解决了这个问题。如果用户触摸到一个非“可拖动”的点,
    ui视图
    将触摸事件传递到其参考底图视图

    @实现MyCustomUIView
    -(BOOL)pointInside:(CGPoint)pointwithevent:(UIEvent*)event
    {
    //检查我们是否在覆盖层上
    如果
    (
    点y<460.0f
    //也许这里有更多的限制
    )
    {
    //阻止事件,传递给父级
    返回否;
    }
    //一切都好吗
    返回YES;
    }
    @结束
    

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

    这是通知中心。因为这是一个系统范围内的手势,如果你在你的应用程序中实现了类似的东西,我怀疑a)苹果会拒绝它,因为它与通知中心冲突;或者b)你的用户不会看到它,因为通知中心会出现。@TomascmGuinness Te问题不是关于实现第二个通知中心,但是关于实现这样的用户交互。@TomasmGuinness,不,不,我只想展示一个这样的uiview控制器,,,这一切…@Kai yess,corret,如何从上到下获得滑动手势?可以使用左右滑动…@stackiphone我根本不使用滑动手势识别器,请参见下面的答案。是的,corret,谢谢你的回答。我知道如何实现滑动手势,但我如何才能像这样显示视图?,,谢谢你的回答,但我对iOS非常新,所以我认为这对我来说不容易。让我们试试吧…如果有任何示例ode或你知道的东西,那对我来说会更容易。。。thanks@Kai奥巴马的解决方案应该奏效。我鼓励您考虑一下,该功能将如何与应用程序中的Notification Center配合使用,以及它对您的用户来说是非直观的还是难以使用。例如,Android具有类似的通知中心功能;此外,您还可以在浏览器中稍微向下拉屏幕以进入地址栏。要在浏览器中访问地址栏而不意外地访问通知中心,可能会很困难。这可能在你的应用程序中运行良好,只是需要考虑一下。@stackiphone添加了一些可能需要调整的示例代码
    @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