2015-12-09 38 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: –