2012-04-25 89 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,則可以將其向上拖動以打開它,同時可以「觸摸」下視圖。這種方法的好處是,所有的動畫都會繼承默認行爲,而且您不必親自實施它。