我在我的iPhone應用程序中看到,狀態欄上有一個可以訪問通知中心的手勢。我如何在我的應用程序中實現這種轉換?我認爲這是通過滑動手勢識別器完成的,但是如何從上到下包含滑動手勢(如何將通知中心拖動到完整過渡狀態)?有沒有任何示例代碼或可以幫助我做到這一點的東西? Thaks提前在iOS 5中拖動UIView
回答
應該很容易做到。假設您有一個UIView
(mainView
),您想從中觸發下拉事件。
- 將子視圖(
pulldownView
)放在mainView頂部可見區域之外。 - 在
mainView
上執行touchesBegan
並檢查觸摸是否在前30個像素(或點)中。 - 執行
touchesMoved
如果您檢查移動方向是否關閉,並且pulldownView
不可見,如果是,請將pulldownView
向下拖動到主視圖的可見區域,或者檢查移動方向是否向上,如果是,則向上推出可見區域。 - 執行
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.));}];
}
}
,,謝謝你的回答,但是我對iOS很新,所以我認爲它對我來說不是那麼容易..如果有任何樣本代碼或你知道的東西,那將會更容易我...謝謝 – stackiphone 2012-04-25 15:13:01
@ Kai的解決方案應該可以工作。我建議您稍微考慮一下該功能如何與您的應用中的Notification Center配合使用,以及它是否對用戶不直觀或難以使用。例如,Android具有類似的通知中心功能;此外,您還可以在瀏覽器中輕輕拉下屏幕以訪問地址欄。可能很難在瀏覽器中訪問地址欄,而不會意外獲取通知中心。這在您的應用中可能正常工作,只是需要思考。 – strings42 2012-04-25 15:17:15
@stackiphone添加了一些示例代碼,可能需要一些調整 – 2012-04-25 15:54:31
您可以實現UISwipeGestureRecognizer來處理您的應用中的滑動手勢,並指定滑動的方向以檢測爲UISwipeGestureRecognizerDirectionDown。
有一個Apple sample here。還有一些WWDC10 sessions值得一看。我建議使用that page的「簡化手勢識別器的觸摸事件處理」和「高級手勢識別」。
是的相關,謝謝你的答案..我知道如何實施滑動手勢,但我怎麼能顯示這樣的看法? – stackiphone 2012-04-25 15:01:37
我剛好在一個全尺寸的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
,則可以將其向上拖動以打開它,同時可以「觸摸」下視圖。這種方法的好處是,所有的動畫都會繼承默認行爲,而且您不必親自實施它。
- 1. iOS拖動UIView,布效果
- 2. iOS:可拖動的UIView(僅限垂直)
- 3. 拖動UIView
- 4. 在拖動時動畫UIView
- 5. UIGestureRecognizer拖動UIView
- 6. 在QT 5中拖動QWidget
- 7. 如何在uiscrollview中向uiview添加拖動手勢ios
- 8. Swift iOS - 檢測觸摸拖動從外部輸入UIView UIView
- 9. 在UIViews之間拖動UIView
- 10. 在手指下拖動UIView
- 11. UIView拖動事件
- 12. 如何在UiView中拖動UIBezierPath
- 13. swift xcode 8.0 - uiimageview在uiview中拖動
- 14. iOS UiView動畫在ios 5和ios 6設備上產生不同的效果
- 15. UIView在UIView中,拖動以顯示內容
- 16. 沿線路徑拖動uiview
- 17. 「啓動」拖放一個UIView
- 18. 的UIView動畫中斷IOS
- 19. UIView拖動(圖像和文字)
- 20. iOS - UIPanGestureRecognizer:在動畫中拖動
- 21. 在UIView外部拖動時觸發touchesEnded
- 22. 如何使UIbutton在UIView內拖動?
- 23. 防止在UIView之外拖動UIButton
- 24. UIView動畫iOS,Bizzarre
- 25. UIView動畫在iOS中破壞8
- 26. iOS:在UIView中動態創建UISegmentedControl
- 27. 在ios中ImageView的UIView動畫
- 28. IOS拖動,輕彈或扔掉一個UIView
- 29. UIView iOS上可拖動行爲的名稱是什麼?
- 30. 停止UIView被拖動屏幕
這是通知中心。由於這是一個系統範圍的手勢,如果您在應用程序中實施了類似的操作,我懷疑a)Apple會拒絕它,因爲它與通知中心衝突,或者b)您的用戶看不到它,因爲通知中心將出現。 – tomasmcguinness 2012-04-25 14:39:07
@tomasmcguinness問題不是關於實現第二個通知中心,而是關於如何實現用戶交互。 – 2012-04-25 14:44:03
@tomasmcguinness,不,不,我只是想展示一個像這樣的uiview控制器,那alll ... – stackiphone 2012-04-25 14:58:04