在Swift中逐行淡入UITableViewCell

时间:2015-10-22 06:39:56

标签: ios swift uitableview animation

我是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?//
}

6 个答案:

答案 0 :(得分:12)

步骤-1

在初始化单元格的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
}

步骤-2

让我们制作淡出动画。 UITableViewDelegatewillDisplayCell方法可以检测到当您滚动到顶部或底部时,第一个单元格将显示在窗口上。

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
    })
}