2015-03-31 116 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」。這將是更清晰的