ios - 在 swift 2.0 中一次显示一个字符的文本

标签 ios swift uiview uitextview nsattributedstring

Swift 2.0 新增功能;尝试学习它,对动画感兴趣,并尝试编写一些代码来一次在屏幕上显示一个字符的消息。

我写了这个,它有效,但我忍不住,但我不能用 CALayers 和/或 alpha 值做一些事情吗?或者一些有生命力的小发明,一些更快速的值得的东西;这感觉和看起来有点笨重,确实是 1977 年的风格。

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 类中。

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

关于ios - 在 swift 2.0 中一次显示一个字符的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33858956/

相关文章:

swift - 如何使用 swift 3 和 iOS 10 将 zip 文件上传到 FTP 服务器?

swift - 将 UIButton 的 CenterYAnchor 对齐到 UIPageControl Swift

swift - 如何让我的菜单栏应用程序在登录时启动?

ios - View 与另一个 View 重叠

ios - Pod 安装报错 Mapbox

ios - 如何在 iOS 中使用 health-kit 获取 bodyTemperature?

ios - UIView BOOL 的奇怪行为

ios - 多点触控时 UITouches "lost"

objective-c - 如何遍历并在数组中添加重复项

ios - 如何使用 AVPlayer 从数组中选择后播放下一首轨道