2010-06-30 43 views
5

我將如何去實現從UIPopoverController拖放UIView到後面UIView從UIPopoverController拖放到其他UIView

這是頁面在插入媒體彈出窗口中提供的功能,您可以從UIPopoverController中拖出一個形狀並將其放到主文檔中。

我實際上與pan UIGestureRecognizers和他們將在哪裏實施混淆。

感謝,

烏默爾

+0

哥們我很困惑..什麼是UIPopoverController和UIGestureRecognizers?當然不是UIKit組件。你是指一些自定義視圖...還是某種你想要的功能..? – lukya 2010-06-30 11:42:14

+1

@lukya UIPopovercontroller和UIGestureRecognizers都是用於Ipad的UIKit的一部分(Uigesturerecognizer也適用於iPhone) – Daniel 2010-06-30 13:44:44

+0

@Daniel關於如何構造對象的任何想法? – umerh 2010-06-30 21:15:54

回答

6

你必須處理兩個視圖控制器一個是在一個名爲mainController一個使用UIPopoverViewController稱爲popoverController所呈現的背景。你的popoverController可以添加UIPanGestureRecognizer到視圖,用戶可以拖動。 gestureRecognizer的動作目標可以是popoverController上的一個方法。

一旦用戶開始拖動操作,您的動作方法將以gestureRecognizer作爲參數調用,如果gestureRecognizer的狀態爲UIGestureRecognizerStateBegan。您可以保存視圖的當前幀,以便能夠在丟棄失敗時將其回放。可能有必要將視圖移動到其他超級視圖(例如窗口),因爲我不確定UIPopoverViewController clipsToBounds它的視圖。

隨着用戶的拖動,您的動作方法會在狀態爲UIGestureRecognizerStateChanged的狀態下通過gestureRecognizer反覆調用。使用UIPanGestureRecognizer上的translationInView:方法來確定用戶相應地拖動和更新拖動視圖中心/框架/變換的量。

一旦用戶擡起手指,動作方法會在手勢狀態設置爲UIGestureRecognizerStateEnded的最後一次被調用。現在是時候瞭解阻力是否成功。例如,popoverController可以通過委託來詢問mainController是否在視圖當前位置下有一個放置目標,如果是的話mainController可以採取行動,否則popoverController會將拖動的視圖動起來,並將其添加回來,作爲子視圖的視圖。

我希望這可以以某種方式理解和幫助。

+0

非常感謝您的詳細解答。我想我現在明白了。在UIGestureRecognizerStateBegan中,我將添加一個新的UIView到窗口中,最後調整UIGestureRecognizerStateEnded中的所有內容,並從窗口中移除UIView將是我的出路。 再次感謝。 – umerh 2010-07-03 15:37:59

7

根據UIPopoverController的文檔,當彈出窗口出現時,它會顯示在一個特殊的「窗口」上。因此,只需將子視圖添加到彈出視圖控制器的內容視圖控制器就不足以將視圖拖到彈出視圖控制器視圖之外。

這裏最簡單的解決方案是創建自己的窗口,拖動時將可拖動視圖添加到窗口。使窗口在拖放過程中可見,然後在完成時釋放窗口。

如上所述,手勢識別器(GR)最適合拖放功能。一旦GR的狀態變爲「開始」,GR將控制所有觸摸,直到達到「已結束」或「已取消」狀態,這使得它非常適合在視圖控制器之間以及窗口之間拖動視圖:)

示例:

@interface MySplitViewController : UISplitViewController { 

    UIView *dragView; 
    UIWindow *dragWindow; 
} 

實現: 我們並不需要調用 「makeKeyAndVisible」 我們的窗口上。我們只需要設置其「隱藏」屬性

從Apple關於makeKeyAndVisible方法: //方便。大多數應用程序調用它來顯示主窗口,並使其成爲關鍵。否則使用視圖隱藏屬性

-(void)dragBegan{ 

    self.dragWindow = [[UIWindow alloc] initWithFrame:self.view.window.frame]; 
    [self.dragWindow addSubview:self.dragView]; 
    [self.dragWindow setHidden:NO]; 
} 

這裏我們處理手勢識別器的「已結束」或「已取消」狀態。 注意:拖放完成時刪除窗口很重要,否則您將失去與下面視圖的用戶交互性。

-(void)dragEnded{ 

    [self.dragView removeFromSuperview]; 

    [self.dragWindow setHidden:YES]; 
    [self.dragWindow release]; 

    [self.view addSubview:self.dragView]; 
} 
相關問題