2012-04-25 79 views
3

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

+3

这是通知中心。由于这是一个系统范围的手势,如果您在应用程序中实施了类似的操作,我怀疑a)Apple会拒绝它,因为它与通知中心冲突,或者b)您的用户看不到它,因为通知中心将出现。 – tomasmcguinness 2012-04-25 14:39:07

+2

@tomasmcguinness问题不是关于实现第二个通知中心,而是关于如何实现用户交互。 – 2012-04-25 14:44:03

+0

@tomasmcguinness,不,不,我只是想展示一个像这样的uiview控制器,那alll ... – stackiphone 2012-04-25 14:58:04

回答

10

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

  1. 将子视图(pulldownView)放在mainView顶部可见区域之外。
  2. mainView上执行touchesBegan并检查触摸是否在前30个像素(或点)中。
  3. 执行touchesMoved如果您检查移动方向是否关闭,并且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.));}]; 
    } 
} 
+0

,,谢谢你的回答,但是我对iOS很新,所以我认为它对我来说不是那么容易..如果有任何样本代码或你知道的东西,那将会更容易我...谢谢 – stackiphone 2012-04-25 15:13:01

+0

@ Kai的解决方案应该可以工作。我建议您稍微考虑一下该功能如何与您的应用中的Notification Center配合使用,以及它是否对用户不直观或难以使用。例如,Android具有类似的通知中心功能;此外,您还可以在浏览器中轻轻拉下屏幕以访问地址栏。可能很难在浏览器中访问地址栏,而不会意外获取通知中心。这在您的应用中可能正常工作,只是需要思考。 – strings42 2012-04-25 15:17:15

+1

@stackiphone添加了一些示例代码,可能需要一些调整 – 2012-04-25 15:54:31

1

您可以实现UISwipeGestureRecognizer来处理您的应用中的滑动手势,并指定滑动的方向以检测为UISwipeGestureRecognizerDirectionDown。

有一个Apple sample here。还有一些WWDC10 sessions值得一看。我建议使用that page的“简化手势识别器的触摸事件处理”和“高级手势识别”。

+0

是的相关,谢谢你的答案..我知道如何实施滑动手势,但我怎么能显示这样的看法? – stackiphone 2012-04-25 15:01:37

0

我刚好在一个全尺寸的UIScrollView使用子类UIView解决了这个问题。如果用户触摸不是“可拖动”的点,则UIView将触摸事件传递到其下面的视图。

@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仅响应460px以下的触摸。如果您的UIScrollView例如800px高度,则可以将它从460px触摸到800px。足以打开,关闭并使用它。因此,如果您获得了全尺寸的UIScrollView,则可以将其向上拖动以打开它,同时可以“触摸”下视图。这种方法的好处是,所有的动画都会继承默认行为,而且您不必亲自实施它。