如何在Swift中使用MarqueeLabel?

问题描述 投票:4回答:6

我想知道是否有一种方法可以启用文本的水平滚动,即字幕类型文本。我使用过这个库:https://github.com/cbpowell/MarqueeLabel-Swift并将“MarqueeLabel.Swift”文件添加到我的应用程序中。但到目前为止,它并没有显示出我想要的效果。

这是我实现它的方式:

class ViewController: UIViewController 
{
@IBOutlet weak var marqueeLabel: MarqueeLabel! 
override func viewDidLoad() {
    super.viewDidLoad()
        self.marqueeLabel.tag = 101
        self.marqueeLabel.type = .Continuous
        self.marqueeLabel.speed = .Duration(5)
        self.marqueeLabel.animationCurve = .EaseInOut
        self.marqueeLabel.fadeLength = 10.0
        self.marqueeLabel.leadingBuffer = 30.0
        self.marqueeLabel.trailingBuffer = 20.0
        self.marqueeLabel.restartLabel()
 }
}

我根据“MarqueeLabel Swift not working”中的解决方案在界面构建器中设置了自定义类。它仍然无法正常工作。

我得到的只是一个没有选框效果(或水平文字滚动)的标签。

P.S:我也是iOS开发的新手。此外,我在实现此库之前尝试使用UIScrollView和UITextView。我不能使用UIWebView,因为我试图在TVOS中实现它。

我的问题是:

  1. 我在哪里错误的代码?
  2. 有没有其他方法可以使用Swift显示选框效果?

提前致谢。

ios xcode swift tvos marquee
6个回答
8
投票

我用我的标签的这一小段代码滚动像字幕:

@IBOutlet weak var firstLabel: UILabel! 
override func viewDidLoad() {
    super.viewDidLoad()

    UIView.animateWithDuration(12.0, delay: 1, options: ([.CurveLinear, .Repeat]), animations: {() -> Void in
            self.firstLabel.center = CGPointMake(0 - self.firstLabel.bounds.size.width / 2, self.firstLabel.center.y)
            }, completion:  { _ in })
}

是的,它奏效了。


4
投票

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

4
投票

在不使用任何第三方库或pod的情况下更新了Swift 3

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

特别感谢:

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

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

点击这里查看演示1


2
投票

由于最初的问题与tvOS有关,我刚刚发现错误(经过数周的搜索!)tvOS 12 beta已经实现了这个:

enter image description here

只有当祖先聚焦时(例如当我们为电影海报添加标题并滚动到它时)才会获得选框效果,当然,如果这是目标,可以直接使用来自TVUIKit的TVPosterView(如this example),但是尽管如此,它仍适用于单一标签。


1
投票

简单的选框 - 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
投票

在Swift 4中

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 })
© www.soinside.com 2019 - 2024. All rights reserved.