我想知道是否有一种方法可以启用文本的水平滚动,即字幕类型文本。我使用过这个库: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中实现它。
我的问题是:
提前致谢。
我用我的标签的这一小段代码滚动像字幕:
@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 })
}
是的,它奏效了。
在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 })
}
在不使用任何第三方库或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
由于最初的问题与tvOS有关,我刚刚发现错误(经过数周的搜索!)tvOS 12 beta已经实现了这个:
只有当祖先聚焦时(例如当我们为电影海报添加标题并滚动到它时)才会获得选框效果,当然,如果这是目标,可以直接使用来自TVUIKit的TVPosterView(如this example),但是尽管如此,它仍适用于单一标签。
简单的选框 - 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])
}
}
在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 })