在 Swift 中移动 UITableView 位置

Moving UITableView position in Swift

我正在尝试为 UITableView 制作动画,以便当视图出现时,它会从屏幕底部向上滑动。我尝试过使用来自不同问题的大量不同方法,但没有任何建议对我有用。

我现在的是这样的:

override func viewDidLoad() {
    super.viewDidLoad()

    menuTableView.layer.cornerRadius = 7

    menuTableView.delegate = self
    menuTableView.dataSource = self
    view.addSubview(menuTableView)

    menuTableView.frame.origin.y = menuTableView.frame.origin.y + menuTableView.frame.height
    // Do any additional setup after loading the view.
}

override func viewDidAppear(animated: Bool) {
    if (menuTableView.indexPathForSelectedRow() != nil) {
        menuTableView.deselectRowAtIndexPath(menuTableView.indexPathForSelectedRow()!, animated: true)
    }

    UIView.animateWithDuration(10, animations: {
        self.menuTableView.frame.origin.y - menuTableView.frame.height
    })
}

有人建议将 UITableView 添加为子视图,所以我尝试了,但它也不起作用。 table 保持原样。

有谁知道在 Swift 中有效的方法吗?

您可以尝试更改 table contentInset 而不是更改框架。

override func viewDidLoad() {
    super.viewDidLoad()

    menuTableView.layer.cornerRadius = 7

    menuTableView.delegate = self
    menuTableView.dataSource = self
    view.addSubview(menuTableView)

    menuTableView.contentInset = UIEdgeInsets(top: self.view.bounds.height, left: 0, bottom: 0, right: 0)
}

override func viewDidAppear(animated: Bool) {
    if (menuTableView.indexPathForSelectedRow() != nil) {
        menuTableView.deselectRowAtIndexPath(menuTableView.indexPathForSelectedRow()!, animated: true)
    }

    UIView.animateWithDuration(10, animations: {
         self.menuTableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    })
}

因此 table 视图始终位于顶部,只有 table 单元格的顶部边缘从底部移动到顶部。

============================================= ===========================

编辑

我稍微修改了你的代码,让背景图片一起移动。

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    var frame = self.menuTableView.frame
    frame.origin.y += menuTableView.frame.height
    self.menuTableView.frame = frame
}

override func viewDidAppear(animated: Bool) {
    if (menuTableView.indexPathForSelectedRow() != nil) {
        menuTableView.deselectRowAtIndexPath(menuTableView.indexPathForSelectedRow()!, animated: true)
    }

    UIView.animateWithDuration(10, animations: {
        var frame = self.menuTableView.frame
        frame.origin.y -= self.menuTableView.frame.height
        self.menuTableView.frame = frame
    })
}

1: 如果您想在应用所有约束后更改框架,请将您的初始框架代码放在 viewDidLayoutSubviews 中。

2:要改变frame,需要调用frame属性的setter。

someView.frame = someFrame

如果还有问题请告诉我。

编辑

Github link 工作演示:https://github.com/liusally/SlideUpMenuTableView

您可以通过更改 contentOffset 属性 向上或向下移动 UITableView。如下所示。

var currentOffset : CGPoint?
let screenScaleFactor : CGFloat = UIScreen.main.bounds.size.width / 375.0 

func moveTableViewUp() {
DispatchQueue.main.async {
   self.currentOffset = self.tblView.contentOffset // saving current position of tableView
   let maxY = self.tblView.contentOffset.y
   let offset = CGPoint.init(x: 0, y: maxY+200.0*screenScaleFactor) // set moving up value
   self.tblView.setContentOffset(offset, animated: false)
 }
}

func moveTableViewToOriginalPosition() {
   DispatchQueue.main.async {
        self.tblView.contentOffset =  self.currentOffset!
  }
}