iOS文字滚动效果,跑马灯效果

1,567 阅读1分钟

很多时候设计需要文字滚动效果,如下图所示

a9koq-j2bey.gif

上下滚动主要可以使用两种方法:

1.两个label交替出现


import UIKit

import RxSwift

class verticalScrollLabelView: UIView {

  var firstLabel: UILabel = {

    let label = UILabel()

    label.font = UIFont.systemFont(ofSize: 12)

    label.textColor = .black

    label.textAlignment = .center

    return label

  }()

  var secondLabel: UILabel = {

    let label = UILabel()

    label.font = UIFont.systemFont(ofSize: 12)

    label.textColor = .black

    label.textAlignment = .center

    return label

  }()

  var defaultText: String = "已成功领取"

  var disposeBag = DisposeBag.init()

  override init(frame: CGRect) {

    super.init(frame: frame)

    self.backgroundColor = .gray

    let width = frame.size.width

    let height = frame.size.height

    firstLabel.frame = self.bounds

    secondLabel.frame = CGRect(x: 0, y: height, width: width, height: height)

    firstLabel.text = "用户\(Int.random(in: 0...9))\(Int.random(in: 0...9))\(self.defaultText)"

    secondLabel.text = "用户\(Int.random(in: 0...9))\(Int.random(in: 0...9))\(self.defaultText)"

    self.addSubview(firstLabel)

    self.addSubview(secondLabel)

    self.layer.masksToBounds = true

    self.layer.cornerRadius = 12.5

    let _ = Observable<Int>.interval(RxTimeInterval.seconds(2), scheduler: MainScheduler())

.subscribe(onNext: { [weak self] _ in

      guard let self = self else { return }

      self.scorll()

    }).disposed(by: disposeBag)

}

  func scorll() {

    let height = firstLabel.frame.size.height

    let width = firstLabel.frame.size.width

    UIView.animate(withDuration: 1, animations: {

    let labelArray = self.subviews

    for view in labelArray {

      if view.isKind(of: UILabel.self){

      let label = view

      var rect = label.frame

      rect.origin.y -= height

      label.frame = rect

    }

  }

}, completion: {_ in

      if (self.firstLabel.frame.origin.y == -height) {

      self.firstLabel.frame = CGRect(x: 0, y: height, width: width, height: height)

      self.firstLabel.text = "用户\(Int.random(in: 0...9))\(Int.random(in: 0...9)))\(self.defaultText)"

}

      if (self.secondLabel.frame.origin.y == -height) {

        self.secondLabel.frame = CGRect(x: 0, y: height, width: width, height: height)

        self.secondLabel.text = "用户\(Int.random(in: 0...9))\(Int.random(in: 0...9)))\(self.defaultText)"

      }

    })

}

  required init?(coder: NSCoder) {

    super.init(coder: coder)

  }

}

2.使用CATransition动画

self.scrollLabel.text = "用户\(Int.random(in: 0...9))\(Int.random(in: 0...9))已领取"

Timer.scheduledTimer(withTimeInterval: 2, repeats: true) { (timer) in

  self.scrollLabel.text = "用户\(Int.random(in: 0...9))\(Int.random(in: 0...9))已领取"

  let ca = CATransition()

  ca.duration = 1

  ca.subtype = CATransitionSubtype.fromTop

  ca.type = CATransitionType.push

  self.scrollLabel.layer.add(ca, forKey: nil)

}

3.左右滚动

使用JXMarqueeView,用法比较简单就略过了