2015-12-09 39 views
0

我的平移手勢以編程方式假按鈕按下。如果按下實際的按鈕,VC的viewDidLoad會再次運行一次,停止並很好。 但是當我使用泛手勢以編程方式假按鈕按下時,viewDidLoad運行約七次,然後停止。潘Segue調用viewDidLoad循環

右邊手勢會觸發加載少數幾次的「明天」狀態。此時,左邊手勢會觸發「今天」狀態。這也加載4-5次。

任何想法?下面的一些代碼,如果需要。

潘姿態加入viewDidLoad中:

//Adds edge gesture depending on VC state 
    if curMainList == "Today" { 
     let panLeftEdgeGesture_MainVC = UIScreenEdgePanGestureRecognizer(target: self, action: "panLeftEdge_toLifeList:") 
     panLeftEdgeGesture_MainVC.edges = .Left 
     view.addGestureRecognizer(panLeftEdgeGesture_MainVC) 

     let panRightEdgeGesture_MainVC = UIScreenEdgePanGestureRecognizer(target: self, action: "panFromRightEdgeAction:") 
     panRightEdgeGesture_MainVC.edges = .Right 
     view.addGestureRecognizer(panRightEdgeGesture_MainVC) 

     self.footer_LeftBtn.addTarget(self, action: "LeftFooterBtnPress", forControlEvents: UIControlEvents.TouchUpInside) 
    } 
    else { 
     let panLeftEdgeGesture = UIScreenEdgePanGestureRecognizer(target: self, action: "panFromLeftEdgeAction:") 
     panLeftEdgeGesture.edges = .Left 
     view.addGestureRecognizer(panLeftEdgeGesture) 
    } 

手勢的觸發:

//Gestures visible when view is 'Today' 
func panLeftEdge_toLifeList(sender: UIScreenEdgePanGestureRecognizer) { 
    dispatch_async(dispatch_get_main_queue()) {() -> Void in 
     self.performSegueWithIdentifier("segueToLifeLists", sender: nil) 
    } 
} 

func panFromRightEdgeAction(sender: UIScreenEdgePanGestureRecognizer) { 
    //self.tomHdrBtnPress(tomorrowHdr) 
    tomorrowHdr.sendActionsForControlEvents(UIControlEvents.TouchUpInside) 
} 

//Gesture added when viewing 'Tomorrow' list 
func panFromLeftEdgeAction(sender: UIScreenEdgePanGestureRecognizer) { 
    //self.todayHdrBtnPress(todayHdr) 
    todayHdr.sendActionsForControlEvents(UIControlEvents.TouchUpInside) 
} 

@IBAction func todayHdrBtnPress(sender: AnyObject) { 
    UIView.animateWithDuration(0.75, animations: { 
     //Header changes 
     self.hdrBox.backgroundColor = UIColor(red: 46/255.0, green: 173/255.0, blue: 11/255.0, alpha: 1.0) 
     self.footer_RightArrow.hidden = false 
     self.footer_RightBtn.hidden = false 
     } 
     , completion: nil 
    ) 
    curMainList = "TodayTask" 
    currentListEntity = curMainList 
    viewDidLoad() 
} 

@IBAction func tomHdrBtnPress(sender: AnyObject) { 
    UIView.animateWithDuration(0.75, animations: { 
     //Header changes 
     self.hdrBox.backgroundColor = UIColor(red: 49/255.0, green: 82/255.0, blue: 171/255.0, alpha: 1.0) 
     self.footer_LeftBtn.addTarget(self, action: "LeftFooterBtnPress", forControlEvents: UIControlEvents.TouchUpInside) 
     } 
     , completion: nil 
    ) 
    curMainList = "TomTask" 
    currentListEntity = curMainList 
    viewDidLoad() 
} 
+0

您不應該「以編程方式僞造按鈕按下」。而且你不應該手動調用生命週期事件。你在很多方面都從根本上解決了這個問題。 – nhgrif

+1

你究竟在做什麼*試圖*實際*做什麼?需要重複調​​用'viewDidLoad'的是什麼? – nhgrif

+0

@nhgrif從用戶的角度來看,平底鍋正在觸發一個新的頁面。它實際上是標題標題和顏色改變的VC。但對用戶來說,他們會覺得自己在刷卡切換頁面。沒有什麼應該反覆運行。看看它如何更新列表變量?當viewDidLoad運行時,它會注意到該變量已更改,並將使用不同的值加載標題和表格。 –

回答

1

的問題是,平移手勢是連續手勢(這意味着當你移動你的手指,處理程序反覆調用)。對於一個平移手勢,它與.Began一個gesture.state調用一次,用.Changed爲用戶的手指移動一個state重複,並且最終用.Ended.Cancelled一個state用戶停止手勢時。

所以,你通常不會從連續手勢觸發animateWithDuration。您只需根據例如gesture.translationInView()或您有什麼更新狀態。只需立即更新視圖以反映更新的泛,並且它被頻繁調用,它最終呈現感覺像動畫的東西,但它實際上僅僅是連續更新的一系列更新,您的手勢識別器的處理程序作爲用戶接收在他們的姿態中前進。

在連續手勢內動畫的唯一時間是.Ended.Cancelled,以完成動畫。例如,用戶可能會用手指拖動手指,.Changed您只是在沒有任何動畫的情況下立即更新視圖,但當他們擡起手指(即手勢處理程序接收到.Ended)時,您可以動畫完成視圖的最終狀態。

底線,手勢識別器中的處理是一個非常不同的動畫機制,可能由一個按鈕(您在其中調用animateWithDuration方法一次來啓動UIKit然後爲您照顧的動畫)產生動畫。最好不要將這兩種截然不同的更新/動畫用戶界面動畫方式混爲一談。


你也正在你的一個pan處理程序中執行segue。如果您希望在平移時以交互方式執行Segue,則應參考WWDC 2013視頻Custom Transitions Using View Controllers,該視頻展示瞭如何將動畫控制器(決定動畫本質)與交互控制器(將控制器的進度動畫控制器的手勢)。但是在這種模式中,您只執行一次segue,只更新手勢中的UIPercentDrivenInteractiveTransition,手勢會將轉換的進度與用戶的手指關聯起來。 `

+0

謝謝!我的新功能如下所示:func panFromLeftEdgeAction(sender:UIScreenEdgePanGestureRecognizer){switch(sender.state){ case UIGestureRecognizerState.Ended: –