我是swift的新手,我正在尝试使用UITableView,并且将逐个动画显示单元格。我怎样才能做到这一点?此外,如果新出现的单元格行不在屏幕上(隐藏在表格下方)。每个单元格出现时如何移动表格?
var tableData1: [String] = ["1", "2", "3", "4", "5", "6", "7"]
override func viewWillAppear(animated: Bool) {
tableView.scrollEnabled=false
tableView.alpha=0.0
NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(3), target: self, selector: "animateTable", userInfo: nil, repeats: false)
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.tableData1.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:TblCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! TblCell
cell.lblCarName.textAlignment = NSTextAlignment.Justified;
return cell
}
func animateTable() {
//what should be the code?//
}
答案 0 :(得分:12)
在初始化单元格的cellForRowAtIndexPath
方法中,将其隐藏起来;
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: TblCell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TblCell
cell.continueLabel.textAlignment = .justified
cell.contentView.alpha = 0
return cell
}
让我们制作淡出动画。 UITableViewDelegate
有willDisplayCell
方法可以检测到当您滚动到顶部或底部时,第一个单元格将显示在窗口上。
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
UIView.animate(withDuration: 0.8, animations: {
cell.contentView.alpha = 1
})
}
您的淡入淡出动画正在进行中。最重要的是,您无法在运行时直接设置单元格的alpha,因为iOS正在对您的UITableView
单元格进行一些特殊的内部处理,并忽略您的设置。因此,如果您设置了自己的小区contentView
,那么一切都会好的。
答案 1 :(得分:4)
在UITableView中,当行进入“视野范围”时,会自动为您准备行。我假设你是,至少不是最初,能够滚动tableView,所以我们将以编程方式滚动它使行显示为它。我们怎么做?实际上UITableView有一个让我们将它滚动到特定行的方法:
scrollToRowAtIndexPath(indexPath : NSIndexPath, atScrollPosition : UITableViewScrollPosition, animated : Bool);
我太累了,无法编写代码,所以我将尝试解释。首先,对于每个单元格,只要加载(cellForRowAtIndexPath),就将alpha设置为0。 然后让我们假设我们的屏幕适合5行。你将按顺序动画他们的alphas(使用UIView.animateWithDuration),直到第五个(索引4),然后你将使用5,然后6,...直到其余的(使用scrollPosition =。)滚动传递NSIndexPath的scrollToRowAtIndexPath。底部)。对于他们每个人,你会在他们加载后立即动画。请记住在这些互动之间留出一些时间。 (首先动画,将NSTimer运行到第二个,然后继续)。布尔动画当然应该是真的。
答案 2 :(得分:2)
以下是一些可以帮助您入门的代码。在我的COBezierTableView
我将UITableView
子类化并覆盖layoutSubviews
方法。在那里,您可以根据它们在视图中的相对位置来操纵单元格。在这个例子中,我将它们淡出底部。
import UIKit
public class MyCustomTableView: UITableView {
// MARK: - Layout
public override func layoutSubviews() {
super.layoutSubviews()
let indexpaths = indexPathsForVisibleRows!
let totalVisibleCells = indexpaths.count - 1
if totalVisibleCells <= 0 { return }
for index in 0...totalVisibleCells {
let indexPath = indexpaths[index]
if let cell = cellForRowAtIndexPath(indexPath) {
if let superView = superview {
let point = convertPoint(cell.frame.origin, toView:superView)
let pointScale = point.y / CGFloat(superView.bounds.size.height)
cell.contentView.alpha = 1 - pointScale
}
}
}
}
}
答案 3 :(得分:2)
要逐个显示每个可见单元格,您可以通过播放alpha和持续时间值来实现。
extension UITableView {
func fadeVisibleCells() {
var delayCounter = 0.0
for cell in self.visibleCells {
cell.alpha = 0.0
UIView.animate(withDuration: TimeInterval(delayCounter)) {
cell.alpha = 1.0
}
delayCounter += 0.30
}
}
}
答案 4 :(得分:0)
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell .alpha = 1.0
let transform = CATransform3DTranslate(CATransform3DIdentity, 0, 3000, 1200)
//let transform = CATransform3DTranslate(CATransform3DIdentity, 250, 0, 1250)
//let transform = CATransform3DTranslate(CATransform3DIdentity, 250, 1250, 0)
// let transform = CATransform3DTranslate(CATransform3DIdentity, -250, 300, 120)
cell.layer.transform = transform
UIView.animate(withDuration: 1.0) {
cell.alpha = 1.0
cell.layer.transform = CATransform3DIdentity
cell.layer.transform = CATransform3DIdentity
}
}
答案 5 :(得分:0)
我认为这种方法将是一个很好的解决方案。
- 将所有单元格的alpha设置为0
- 在tableView(_ :, willDisplay:,forRowAt :)中为其设置动画
- 为每个
indexPath.row
设置一个延迟
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.alpha = 0
UIView.animate(withDuration: 0.5, delay: 0.05 * Double(indexPath.row), animations: {
cell.alpha = 1
})
}