How to use MarqueeLabel in Swift?

后端 未结 7 1549
无人及你
无人及你 2021-01-05 19:17

I want to know if there\'s a way to enable horizontal scrolling of text i.e., marquee type text. I have used this library: https://github.com/cbpowell/MarqueeLabel-Swift and

相关标签:
7条回答
  • 2021-01-05 19:37

    In Swift 4

    CODE

    UIView.animate(withDuration: 1.0, delay: 1, options: ([.curveLinear, .repeat]), animations: {() -> Void in
                self.marqueeLABEL.center = CGPoint(x: self.marqueeLABEL.bounds.size.width, y: self.marqueeLABEL.center.y)
            }, completion:  { _ in })
    
    0 讨论(0)
  • 2021-01-05 19:44

    In SWIFT 3:

    @IBOutlet weak var YOURLABEL: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        UIView.animate(withDuration: 12.0, delay: 1, options: ([.curveLinear, .repeat]), animations: {() -> Void in
            self.YOURLABEL.center = CGPoint(x: 0 - self.YOURLABEL.bounds.size.width / 2, y: self.YOURLABEL.center.y)
        }, completion:  { _ in })
    }
    
    0 讨论(0)
  • 2021-01-05 19:45

    Since the original question was related to tvOS, I have just found out by mistake (after weeks of searching!) that tvOS 12 beta has implemented this:

    One gets the marquee effect only when the ancestor is focused (like when we add a title to a movie poster and scroll to it), and sure, one may directly use TVPosterView from TVUIKit (like in this example) if that is the goal, but it works on single labels nonetheless.

    0 讨论(0)
  • 2021-01-05 19:51

    Updated for Swift 3 without using any third party library or pods

    import UIKit
    
    class ViewController: UIViewController {
    
        let redLabel: UILabel = {
    
            let label = UILabel()
            label.translatesAutoresizingMaskIntoConstraints = false
            label.font = .boldSystemFont(ofSize: 16)
            label.textColor = .red
            label.text = "The first paragraph of the body should contain the strongest argument, most significant example, cleverest illustration, or an obvious beginning point."
            return label
        }()
    
        let greenLabel: UILabel = {
    
            let label = UILabel()
            label.translatesAutoresizingMaskIntoConstraints = false
            label.font = .systemFont(ofSize: 14)
            label.textColor = .green
            label.text = "The second paragraph of the body should contain the second strongest argument, second most significant example, second cleverest illustration, or an obvious follow up the first paragraph in the body."
            return label
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            title = "Marquee Label Demo"
            view.backgroundColor = .white
    
            view.addSubview(redLabel)
            view.addSubview(greenLabel)
    
            setupAutoLayout()
            startMarqueeLabelAnimation()
        }
    
        func startMarqueeLabelAnimation() {
    
            DispatchQueue.main.async(execute: {
    
                UIView.animate(withDuration: 10.0, delay: 1, options: ([.curveLinear, .repeat]), animations: {() -> Void in
    
                    self.redLabel.center = CGPoint(x: 0 - self.redLabel.bounds.size.width / 2, y: self.redLabel.center.y)
                    self.greenLabel.center = CGPoint(x: 0 - self.greenLabel.bounds.size.width / 2, y: self.greenLabel.center.y)
    
                }, completion:  nil)
            })
        }
    
        func setupAutoLayout() {
    
            redLabel.leftAnchor.constraint(equalTo: view.rightAnchor).isActive = true
            redLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: 100).isActive = true
            redLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true
    
            greenLabel.leftAnchor.constraint(equalTo: view.rightAnchor).isActive = true
            greenLabel.topAnchor.constraint(equalTo: redLabel.bottomAnchor, constant: 50).isActive = true
            greenLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true
        }
    }
    

    Special Thanks:

    https://stackoverflow.com/users/8303852/kartik-patel

    https://stackoverflow.com/users/8388863/sid-patel

    click here to see demo 1

    0 讨论(0)
  • 2021-01-05 19:52

    Simple marquee - Swift 4.0:

    override func viewDidLoad() {
        super.viewDidLoad()
        marqueeLabel.text = " text text here!"
        _ = Timer.scheduledTimer(timeInterval: 0.3, target: self, selector: #selector(ViewController.marquee), userInfo: nil, repeats: true)
    }
    extension ViewController {
      @objc func marquee(){
    
        let str = marqueeLabel.text!
        let indexFirst = str.index(str.startIndex, offsetBy: 0)
        let indexSecond = str.index(str.startIndex, offsetBy: 1)
        marqueeLabel.text = String(str.suffix(from: indexSecond)) + String(str[indexFirst])
    
      }
    }
    
    0 讨论(0)
  • 2021-01-05 19:53

    You should use like this then it will work.

    NOTE: You can face performance issue by this because it's using recursion in Thread, so for better performance you should use with CATextLayer & CAScrollLayer.

    import UIKit
    import SnapKit
    
    class ViewController: UIViewController {
        
        let label = UILabel()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            label.lineBreakMode = .byWordWrapping
            label.numberOfLines = 0
           
            label.text = "We couldn't turn around 'Til we were upside down I'll be the bad guy now But no, I ain't too proud I couldn't be there Even when I try You don't believe it We do this every time"
           
            view.addSubview(label)
            label.snp.makeConstraints { (make) in
               make.height.equalTo(20)
                make.top.leading.trailing.equalTo(self.view.safeAreaLayoutGuide).inset(50)
            }
          
            autoScroll()
        }
        
        @objc func autoScroll() {
            UIView.animate(withDuration: 12.0, delay: 1, options: ([.curveLinear, .repeat]), animations: {() -> Void in
                self.label.center = CGPoint(x: 0 - self.label.bounds.size.width / 2,y: self.label.center.y)
            }, completion:  { _ in
                self.autoScroll()
            })
        }
    }
    
    0 讨论(0)
提交回复
热议问题