`tableView` 在选择单元格时向上移动

Posted

技术标签:

【中文标题】`tableView` 在选择单元格时向上移动【英文标题】:`tableView` moves up while selecting Cell 【发布时间】:2016-09-09 07:06:42 【问题描述】:

在我的视图控制器中,我有一个tableView,加班时我选择了我的单元格,我的tableview 有点向上移动我不知道为什么会发生,我试图弄清楚为什么会发生,但我什么也没得到。下面是我的代码,如果有人能找出问题所在,那对我很有帮助。

出口和变量:

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var headerView: UIView!
@IBOutlet var verticalSpaceConstraint: NSLayoutConstraint!
var lastVerticalOffset: CGFloat = 0

ViewDidLoad:

tableView.contentInset = UIEdgeInsets(top: headerViewOriginalHeight, left: 0, bottom: 0, right: 0)
tableView.scrollIndicatorInsets = tableView.contentInset
lastVerticalOffset = tableView.contentOffset.y


...........

footerView.addSubview(footerLabel)
footerView.addSubview(footerRetryButton)
footerView.addSubview(activityIndicatorView)

self.tableView.tableFooterView = footerView

代表:

extension myViewController: UITableViewDelegate, UITableViewDataSource 
    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return reviewsArray.count
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

        let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! TagDetailTableViewCell
        ..............................
        return cell
    


    func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
        return UITableViewAutomaticDimension
    

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 

        if  indexPath == selectedIndexPath 
            return UITableViewAutomaticDimension
         else 
            return 100
        

    

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

        tableView.beginUpdates()

        if indexPath == selectedIndexPath 
            selectedIndexPath = NSIndexPath()
        else 
            selectedIndexPath = indexPath
        
        tableView.endUpdates()

        print( "tableView ORIIGN Y AFETER ", tableView.contentOffset.y)

        self.tableView.separatorStyle = .None
        self.tableView.separatorStyle = .SingleLine


    

【问题讨论】:

【参考方案1】:

您将在 DidSelect 方法中删除 tableView Reload 的代码。删除tableView.beginUpdates()tableView.endUpdates(),现在你只需要重新加载TableView的Single Cell。

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

      if indexPath == selectedIndexPath 
        selectedIndexPath = NSIndexPath()
      else 
        selectedIndexPath = indexPath
      

     NSArray* rowsToReload = [NSArray arrayWithObjects:indexPath, nil];
     [myUITableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone];

     self.tableView.separatorStyle = .None
     self.tableView.separatorStyle = .SingleLine

【讨论】:

【参考方案2】:

didselectrow 方法中删除tableView.beginUpdates()tableView.endUpdates()。你不需要在这种情况下使用它!

管理数组以跟踪所选行并相应地管理 cellforrow 并从 didselectrow 重新加载表。

或者在你的viewDidload试试

    self.automaticallyAdjustsScrollViewInsets = false

【讨论】:

嘿伙计,感谢您的回复,我正在使用tableView.beginUpdates(),因为我正在更改所选行的高度,而self.automaticallyAdjustsScrollViewInsets = false 没有用

以上是关于`tableView` 在选择单元格时向上移动的主要内容,如果未能解决你的问题,请参考以下文章

TableView - 选择单元格时的操作

选择 TableView 单元格时无法显示另一个 ViewController

Swift - 选择 TableView 单元格时动画(didSelectRowAtIndexPath)

为 iOS 选择 TableView 单元格时视图已更改

ios:在点击collectionview单元格或tableview单元格时禁用第二个触摸事件

选择单元格时更改图像