问题
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 added the "MarqueeLabel.Swift" file to my application. But so far, it doesn't show the marquee effect that I wanted.
This is how I implemented it:
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()
}
}
I have set the custom class in the interface builder according to the solution in "MarqueeLabel Swift not working" . It still doesn't work.
All I get is just a label displaying without the marquee effect (or horizontal text scroll).
P.S: I am new to iOS development too. Also, I tried using UIScrollView and UITextView before implementing this library. And I cannot use UIWebView as I'm trying to implement this in TVOS.
My questions are:
Where did I go wrong with the code?
Is there an alternative way to display marquee effect using Swift?
Thanks in advance.
回答1:
I used this little piece of code for my label to scroll like marquee:
@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 })
}
Yes, it worked.
回答2:
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 })
}
回答3:
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
回答4:
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])
}
}
回答5:
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.
回答6:
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 })
来源:https://stackoverflow.com/questions/35172267/how-to-use-marqueelabel-in-swift