如何在Swift中使用MarqueeLabel?

时间:2016-02-03 08:48:43

标签: ios xcode swift tvos marquee

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

这是我实施它的方式:

    NSMutableArray *a = [NSMutableArray array];
    [a addObject:@"abc"];
    NSLog(@" 1 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)a));
    __weak  NSMutableArray *b = a;
    NSLog(@" 2 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)a));
    a = nil;
    NSLog(@" 3 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b));
    [b addObject:@"xys"];
    NSLog(@" 4 Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)b));

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

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

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

我的问题是:

  1. 我的代码出了什么问题?

  2. 是否有另一种使用Swift显示选框效果的方法?

  3. 提前致谢。

7 个答案:

答案 0 :(得分: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 })
}

是的,它有效。

答案 1 :(得分: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 })
}

答案 2 :(得分:3)

针对Swift 3进行了更新,未使用任何第三方库或pod

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

答案 3 :(得分:2)

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

enter image description here

只有当祖先聚焦时(例如,当我们向电影海报添加标题并滚动到它时),才能获得字幕效果,并且可以肯定的是,可以直接使用TVUIKit中的TVPosterView(就像{{ 3}}),尽管这是目标,但仍然可以在单个标签上使用。

答案 4 :(得分: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])

  }
}

答案 5 :(得分:1)

您应该这样使用,否则它将起作用。

注意:您可能会遇到性能问题,因为它在Thread中使用了递归,因此,为获得更好的性能,应将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()
        })
    }
}

答案 6 :(得分: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 })