`tableView`在选择Cell时向上移动

时间:2016-09-09 07:06:43

标签: ios uitableview uiscrollview swift2

在我的视图控制器中,我有一个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


    }
}

2 个答案:

答案 0 :(得分:0)

您将在DidSelect方法中删除tableView Reload的代码。删除tableView.beginUpdates()tableView.endUpdates(),现在只重新加载TableView的单个单元格。

 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
}

答案 1 :(得分:0)

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

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

或在viewDidload尝试

    self.automaticallyAdjustsScrollViewInsets = false