在swift 2.0中一次显示一个字符 [英] Displaying text one character at a time in swift 2.0
问题描述
Swift 2.0新手;试图学习它,对动画感兴趣并尝试编写一些代码,一次在屏幕上显示一个消息。
New to Swift 2.0; trying to learn it, interested in animation and tried to write some code to display a message on screen one character at a time.
我写了这个,它有效,但我忍不住可能不会对CALayers和/或alpha值做些什么?或者一些有生命的小发明,更快捷的东西;这种感觉&看起来有点笨重,真的排序1977.
I wrote this, it works, but I cannot help but could I not do something with CALayers perhaps and/or alpha values? Or some animate gizmo, something more swift worthy; this feels & looks kinda clunky, sort 1977 really.
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let supertext = "A long time ago, in a galaxy far, far away ..."
let round = supertext.characters.count
for i in 0...round {
let delay = Double(i)/10
let subtext = supertext[supertext.startIndex..<supertext.startIndex.advancedBy(i)]
NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: "ghostText:", userInfo: ["theText" :subtext], repeats: false)
}
}
var view3:UITextView = UITextView()
func ghostText(timer:NSTimer) {
view3.removeFromSuperview()
let userInfo = timer.userInfo as! Dictionary<String, AnyObject>
let tempText:NSString = (userInfo["theText"] as! NSString)
print(tempText)
let font = UIFont(name: "Georgia", size: 18.0) ?? UIFont.systemFontOfSize(18.0)
let textFont = [NSFontAttributeName:font]
let subChararacter = NSAttributedString(string: String(tempText), attributes: textFont)
view3.frame = CGRect(x: 100, y: 120, width: CGRectGetWidth(self.view.frame), height: CGRectGetWidth(self.view.frame)-20)
view3.attributedText = subChararacter
self.view.addSubview(view3)
}
推荐答案
我假设Swiftworthy是主观的,但这是另一个基于你的代码如何工作的实现,它将NSTimer包装在Swift类中。
I suppose Swiftworthy is subjective, but here's another implementation based on how your code currently works that wraps the NSTimer in a Swift class.
class Timer {
typealias TimerFunction = (Int)->Bool
private var handler: TimerFunction
private var i = 0
init(interval: NSTimeInterval, handler: TimerFunction) {
self.handler = handler
NSTimer.scheduledTimerWithTimeInterval(interval, target: self, selector: "timerFired:", userInfo: nil, repeats: true)
}
@objc
private func timerFired(timer:NSTimer) {
if !handler(i++) {
timer.invalidate()
}
}
}
class ViewController: UIViewController {
let text: NSAttributedString = {
let font = UIFont(name: "Georgia", size: 18.0) ?? UIFont.systemFontOfSize(18.0)
return NSAttributedString(string: "A long time ago, in a galaxy far, far away ...", attributes: [NSFontAttributeName: font])
}()
override func viewDidLoad() {
super.viewDidLoad()
let textView = UITextView(frame: CGRect(x: 100, y: 120, width: CGRectGetWidth(self.view.frame), height: CGRectGetWidth(self.view.frame)-20))
self.view.addSubview(textView)
let _ = Timer(interval: 0.1) {i -> Bool in
textView.attributedText = self.text.attributedSubstringFromRange(NSRange(location: 0, length: i+1))
return i + 1 < self.text.string.characters.count
}
}
}
这篇关于在swift 2.0中一次显示一个字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!