iOS - 模拟“中奖名单循环滚动”效果

1.动态效果图:

a

2.思路:

(1)控件:一个父View,依次添加两个tableVew,使其上下紧挨着,高度均等于所有cell的总高度,且加载相同的的数据,父视图的clipsToBounds属性一定要设置为true

(2)滚动:使用计时器,调整时间及滚动大小,使展示平滑

(3)循环算法:当A列表滚动出界面时,就把它添加在B列表的下面,B列表滚动出界面时,就把它添加在A列表的下面,形成循环效果

3.Swift版核心代码(可直接复制粘贴看效果):

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource{

    var tableView:UITableView!
    var doubleTableView:UITableView!
    let kScreenW = UIScreen.main.bounds.size.width
    let kXPercent = UIScreen.main.bounds.size.width / 375.0
    let kBorderW = CGFloat(15.0)
    let kYPercent = UIScreen.main.bounds.size.width / 375.0
    let cellId:String = "drawViewCell1"

    override func viewDidLoad() {
        super.viewDidLoad()


        self.addListTableView()
    }
    func addListTableView(){

        let tableWidth = kScreenW - kBorderW*3
        let tableBgView = UIView(frame: CGRect(x: (kScreenW-tableWidth)/2.0,y: 100*kYPercent,width: tableWidth,height: 148*kYPercent))
        tableBgView.clipsToBounds = true
        tableBgView.backgroundColor = UIColor.yellow
        self.view.addSubview(tableBgView)

        //

        tableView = UITableView(frame: CGRect(x: 0,y: 0,width: tableWidth,height: 148*kYPercent*2), style: UITableViewStyle.plain)
        tableView.backgroundColor = UIColor.clear
        tableView.delegate = self
        tableView.dataSource = self
        tableView.separatorStyle = UITableViewCellSeparatorStyle.none
        tableBgView.addSubview(tableView)


        doubleTableView = UITableView(frame: CGRect(x: 0,y: tableView.frame.origin.y+tableView.frame.size.height,width: tableWidth,height: 148*kYPercent*2), style: UITableViewStyle.plain)
        doubleTableView.backgroundColor = UIColor.clear
        doubleTableView.delegate = self
        doubleTableView.dataSource = self
        doubleTableView.separatorStyle = UITableViewCellSeparatorStyle.none
        tableBgView.addSubview(doubleTableView)

        //
        Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(personListScroll(timer:)), userInfo: nil, repeats: true)
    }
    @objc func personListScroll(timer:Timer){

        // 1>移动tableView的frame
        var newTableViewframe = self.tableView.frame
        newTableViewframe.origin.y -= 2*kYPercent
        if (newTableViewframe.origin.y < -(doubleTableView.frame.size.height)) {

            newTableViewframe.origin.y = tableView.frame.size.height
        }
        self.tableView.frame = newTableViewframe

        // 2>移动doubleTableView的frame
        var newDoubleViewframe = self.doubleTableView.frame
        newDoubleViewframe.origin.y -= 2*kYPercent
        if newDoubleViewframe.origin.y < -(tableView.frame.size.height) {

            newDoubleViewframe.origin.y = tableView.frame.size.height
        }
        self.doubleTableView.frame = newDoubleViewframe

    }

    //返回行的个数
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        return 10
    }
    //返回列的个数
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1;
    }
    //去除头部空白
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 0.001
    }
    //去除尾部空白
    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        return 0.001
    }
    //返回一个cell
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{

        //回收池
        var cell:UITableViewCell! = tableView.dequeueReusableCell(withIdentifier: cellId)

        if cell == nil{//判断是否为nil

            cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: cellId)
        }
        cell.backgroundColor = UIColor.clear
        cell.selectionStyle = UITableViewCellSelectionStyle.none

        if tableView == self.tableView{// 测试是否循环滚动

            cell.textLabel?.text = "张先生"
        }else {

            cell.textLabel?.text = "李小姐"
        }

        return cell
    }
    //返回cell的高度
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{

        return 148/5.0*kYPercent
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值