2015-03-31 167 views
0

的情况下:https://github.com/ArtworkAD/ios_jumping_y.git的UITableView与UIPanGestureRecognizer导致 “跳跃” 触摸

enter image description here

容器

class ContainerController: UIViewController { 
    @IBOutlet weak var container: UIView! 
    @IBOutlet weak var foregroundTopSpace: NSLayoutConstraint! 
    @IBOutlet weak var foregroundBottomSpace: NSLayoutConstraint! 
} 

容器被连接到所述的UITableViewController其右边。

我想做什么

用户滚动表,当他到达顶部我想用相同的运动向下移动台。所以我只是改变容器视图的顶部/底部空间。但是这会导致表跳转。

class MainController: UITableViewController, UIGestureRecognizerDelegate { 

    var panRecognizer: UIPanGestureRecognizer! 

    var gotStart: Bool = true 

    var startTouch: CGPoint! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.tableView.bounces = false 

     self.panRecognizer = self.tableView.panGestureRecognizer 
     self.panRecognizer.addTarget(self, action: "pan:") 
     self.tableView.addGestureRecognizer(self.panRecognizer) 
    } 

    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
     return true 
    } 

    func pan(rec:UIPanGestureRecognizer){ 

     if let parent = self.parentViewController as? ContainerController { 

      var y = self.tableView.contentOffset.y 
      var touch = rec.locationInView(self.view) 

      // JUMPING y 
      println(touch.y) 

      if y == -64 { 

       if self.gotStart || y < -64 || y > -64 { 

        self.startTouch = touch 
        self.gotStart = false 

       } else { 

        if rec.state == .Changed { 

         var changedVerticalHeight = (self.startTouch.y - touch.y)*(-1) 

         if changedVerticalHeight <= parent.view.frame.size.height && touch.y >= changedVerticalHeight { 

          parent.foregroundTopSpace.constant = changedVerticalHeight 
          parent.foregroundBottomSpace.constant = -changedVerticalHeight 
         } 

        } else if rec.state == .Ended { 

         parent.foregroundTopSpace.constant = 0 
         parent.foregroundBottomSpace.constant = 0 

         self.gotStart = true 
        } 
       } 
      } 
     } 
    } 
} 

结果:

enter image description here

任何想法什么是错?容器视图必须有一些问题,因为当我直接移动表视图时,不会跳跃。

+0

如果您对我的回答有任何疑问,我有您的修改过的项目。我可以毫无问题地寄给你。 – 2015-04-08 23:01:36

+0

@VictorSigler是的,请在github上提出拉取请求以向我显示更改。我接受了你的回答:) – 2015-04-09 07:41:17

+0

我已经在GitHub中完成了请求,让我知道你是否有任何问题。 – 2015-04-09 13:38:33

回答

3

我要澄清一些事情在我的答案之前,我把完整的代码

  1. 您可以使用该功能scrollViewWillEndDragging知道究竟在何处contentOffset打算,看到下面的代码:

    override func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 
        println(targetContentOffset.memory.y)   
    } 
    
  2. 您可以使用函数scrollViewDidEndDecelerating知道当滚动完成它。

然后你就可以合并上述两个提示,完成下列方式你的目标:

class MainController: UITableViewController { 

    var position : CGFloat! 

    override func viewDidLoad() { 
     super.viewDidLoad()  
    } 

    override func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 
     // Save where the contentOffset go   
     position = targetContentOffset.memory.y 
    } 

    override func scrollViewDidEndDecelerating(scrollView: UIScrollView) { 

     // If reach the top or more than the top when the user move the scroll 
     if (position < 0) {    
      var to = scrollView.contentOffset.y + 213 
      scrollView.setContentOffset(CGPoint(x: 0, y: to), animated: true) 
     }   
    }  

    // Default table stuff, not related to problem 

    /* Here comes the rest of your code of TableView */  
} 

我删除了一些代码,以相对于panGestureRecognizer项目和反弹测试。

在行var to = scrollView.contentOffset.y + 213你可以添加position变量或你想要的值,我把213只用于测试下移。

我希望这对你有所帮助。

1

您正在从self.view系统坐标打印位置。 UITableViewController使用像self.view这样的表格视图。所以当用户滚动时,原点(x:0 y:0)开始移动。

您必须为用户提供静态系统坐标。正确使用UIViewControllerUITableViewpanGestureRecognizer财产的打印位置,并得到滚动:

  1. 创建一个新的UIViewController
  2. 添加UITableview和设置AutoLayout
  3. 连接IBOutletUITableView

的代码添加到UIViewController类:

var panRecognizer: UIPanGestureRecognizer! 
@IBOutlet weak var tableView: UITableView? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.panRecognizer = tableView?.panGestureRecognizer; 
    self.panRecognizer .addTarget(self, action: "pan:") 
    tableView?.addGestureRecognizer(self.panRecognizer) 

} 

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return true 
} 

func pan(rec:UIPanGestureRecognizer){ 
    println(rec.locationInView(self.view).y) 
} 

您可以下载该项目例如here

如果你只需要控制滚动,记得UIScrollView delegate method

optional func scrollViewDidScroll(_ scrollView: UIScrollView) 

可以帮助你。这是一个更简单的解决方案:

祝你好运。

+0

谢谢你的回应,但是我对我的问题还不清楚。看看我的编辑。 – 2015-04-02 08:31:21

0

我相信,你想要什么:

import UIKit 

class MainController: UITableViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) { 
     let beginingContentOffset: CGFloat = -64 
     if scrollView.contentOffset.y < beginingContentOffset { 
      scrollView.bounces = false 
      UIView.animateWithDuration(0.05, animations: {() -> Void in 
       scrollView.contentOffset = CGPointMake(0, 0) 
       }, completion: { (finished: Bool) -> Void in 
       scrollView.bounces = true 
      }) 
     } 
    } 

    // Default table stuff, not related to problem 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 20 
    } 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     var cell_ : UITableViewCell? = tableView.dequeueReusableCellWithIdentifier("CELL_ID") as? UITableViewCell 
     if(cell_ == nil){ 
      cell_ = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "CELL_ID") 
     } 

     cell_!.textLabel!.text = "Row " + String(indexPath.row) 

     return cell_! 
    } 
} 

附:这个“-64”值。这是故事板的余量。您可以取消选中约束的边距,它将为“0”。这将是更清晰的