在 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!
}
}
我正在尝试为 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!
}
}