iOS开发基础144-逐字打印效果
在AIGC类的APP中,实现那种一个字一个字、一行一行地打印出文字的效果,可以通过多种方法来实现。下面是一些实现方法,使用Swift和OC来举例说明。
OC版
1. 基于定时器的逐字打印效果
可以使用NSTimer来逐字逐行地显示文字。
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) UITextView *textView;
@property (nonatomic, strong) NSString *content;
@property (nonatomic, assign) NSInteger currentIndex;
@property (nonatomic, strong) NSTimer *timer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.textView = [[UITextView alloc] initWithFrame:self.view.bounds];
self.textView.font = [UIFont systemFontOfSize:18];
self.textView.editable = NO;
self.textView.scrollEnabled = YES;
[self.view addSubview:self.textView];
self.content = @"这是需要逐字逐行打印的文字内容。\n让我们来实现它。";
self.currentIndex = 0;
[self startPrinting];
}
- (void)startPrinting {
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(printNextCharacter) userInfo:nil repeats:YES];
}
- (void)printNextCharacter {
if (self.currentIndex >= self.content.length) {
[self.timer invalidate];
self.timer = nil;
return;
}
NSRange range = NSMakeRange(self.currentIndex, 1);
NSString *nextCharacter = [self.content substringWithRange:range];
self.textView.text = [self.textView.text stringByAppendingString:nextCharacter];
self.currentIndex += 1;
}
@end
2. 使用CADisplayLink来实现高精度逐字打印
CADisplayLink可以在屏幕刷新时调用指定的方法,相较于NSTimer,其精度和性能更高。
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) UITextView *textView;
@property (nonatomic, strong) NSString *content;
@property (nonatomic, assign) NSInteger currentIndex;
@property (nonatomic, strong) CADisplayLink *displayLink;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.textView = [[UITextView alloc] initWithFrame:self.view.bounds];
self.textView.font = [UIFont systemFontOfSize:18];
self.textView.editable = NO;
self.textView.scrollEnabled = YES;
[self.view addSubview:self.textView];
self.content = @"这是需要逐字逐行打印的文字内容。\n让我们来实现它。";
self.currentIndex = 0;
[self startPrinting];
}
- (void)startPrinting {
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(printNextCharacter)];
self.displayLink.preferredFramesPerSecond = 10; // 控制打印速度
[self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)printNextCharacter {
if (self.currentIndex >= self.content.length) {
[self.displayLink invalidate];
self.displayLink = nil;
return;
}
NSRange range = NSMakeRange(self.currentIndex, 1);
NSString *nextCharacter = [self.content substringWithRange:range];
self.textView.text = [self.textView.text stringByAppendingString:nextCharacter];
self.currentIndex += 1;
}
@end
3. CATextLayer + Animation
还可以使用CATextLayer和动画来实现更为复杂和流畅的逐字逐行打印效果。
#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>
@interface ViewController ()
@property (nonatomic, strong) CATextLayer *textLayer;
@property (nonatomic, strong) NSString *content;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.textLayer = [CATextLayer layer];
self.textLayer.frame = self.view.bounds;
self.textLayer.fontSize = 18;
self.textLayer.alignmentMode = kCAAlignmentLeft;
self.textLayer.contentsScale = [UIScreen mainScreen].scale;
self.textLayer.wrapped = YES;
[self.view.layer addSublayer:self.textLayer];
self.content = @"这是需要逐字逐行打印的文字内容。\n让我们来实现它。";
[self startPrinting];
}
- (void)startPrinting {
self.textLayer.string = @"";
for (NSInteger index = 0; index < self.content.length; index++) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(index * 0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSString *nextCharacter = [self.content substringWithRange:NSMakeRange(index, 1)];
self.textLayer.string = [self.textLayer.string stringByAppendingString:nextCharacter];
});
}
}
@end
Swift版
1. 基于定时器的逐字打印效果
可以使用Timer来逐字逐行地显示文字。
import UIKit
class ViewController: UIViewController {
private let textView = UITextView()
private let content = "这是需要逐字逐行打印的文字内容。\n让我们来实现它。"
private var currentIndex = 0
private var timer: Timer?
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(textView)
textView.frame = view.bounds
textView.font = UIFont.systemFont(ofSize: 18)
textView.isEditable = false
textView.isScrollEnabled = true
startPrinting()
}
private func startPrinting() {
timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(printNextCharacter), userInfo: nil, repeats: true)
}
@objc private func printNextCharacter() {
guard currentIndex < content.count else {
timer?.invalidate()
timer = nil
return
}
let nextIndex = content.index(content.startIndex, offsetBy: currentIndex)
textView.text.append(content[nextIndex])
currentIndex += 1
}
}
2. 使用CADisplayLink来实现高精度逐字打印
CADisplayLink可以在屏幕刷新时调用指定的方法,相较于Timer,其精度和性能更高。
import UIKit
class ViewController: UIViewController {
private let textView = UITextView()
private let content = "这是需要逐字逐行打印的文字内容。\n让我们来实现它。"
private var currentIndex = 0
private var displayLink: CADisplayLink?
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(textView)
textView.frame = view.bounds
textView.font = UIFont.systemFont(ofSize: 18)
textView.isEditable = false
textView.isScrollEnabled = true
startPrinting()
}
private func startPrinting() {
displayLink = CADisplayLink(target: self, selector: #selector(printNextCharacter))
displayLink?.preferredFramesPerSecond = 10 // 控制打印速度
displayLink?.add(to: .main, forMode: .default)
}
@objc private func printNextCharacter() {
guard currentIndex < content.count else {
displayLink?.invalidate()
displayLink = nil
return
}
let nextIndex = content.index(content.startIndex, offsetBy: currentIndex)
textView.text.append(content[nextIndex])
currentIndex += 1
}
}
3. CATextLayer + Animation
还可以使用CATextLayer和动画来实现更为复杂和流畅的逐字逐行打印效果。
import UIKit
class ViewController: UIViewController {
private let textLayer = CATextLayer()
private let content = "这是需要逐字逐行打印的文字内容。\n让我们来实现它。"
override func viewDidLoad() {
super.viewDidLoad()
textLayer.frame = view.bounds
textLayer.fontSize = 18
textLayer.alignmentMode = .left
textLayer.contentsScale = UIScreen.main.scale
textLayer.isWrapped = true
view.layer.addSublayer(textLayer)
startPrinting()
}
private func startPrinting() {
textLayer.string = ""
for (index, character) in content.enumerated() {
DispatchQueue.main.asyncAfter(deadline: .now() + Double(index) * 0.1) {
self.textLayer.string = "\(self.textLayer.string ?? "")\(character)"
}
}
}
}
iOS开发基础144-逐字打印效果的更多相关文章
- IOS开发基础知识碎片-导航
1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...
- iOS开发——总结篇&IOS开发基础知识
IOS开发基础知识 1:Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id) 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断 ...
- IOS开发基础环境搭建
一.目的 本文的目的是windows下IOS开发基础环境搭建做了对应的介绍,大家可根据文档步骤进行mac环境部署: 二.安装虚拟机 下载虚拟机安装文件绿色版,点击如下文件安装 获取安装包: ...
- iOS开发基础-九宫格坐标(6)
继续对iOS开发基础-九宫格坐标(5)中的代码进行优化. 优化思路:把字典转模型部分的数据处理操作也拿到模型类中去实现,即将 ViewController 类实现中 apps 方法搬到 WJQAppI ...
- iOS开发基础-九宫格坐标(5)
继续在iOS开发基础-九宫格坐标(4)的基础上进行优化. 一.改进思路 1)iOS开发基础-九宫格坐标(4)中 viewDidLoad 方法中的第21.22行对控件属性的设置能否拿到视图类 WJQAp ...
- iOS开发基础-九宫格坐标(4)
对iOS开发基础-九宫格坐标(3)的代码进行进一步优化. 新建一个 UIView 的子类,并命名为 WJQAppView ,将 appxib.xib 中的 UIView 对象与新建的视图类进行关联. ...
- iOS开发基础-九宫格坐标(3)之Xib
延续iOS开发基础-九宫格坐标(2)的内容,对其进行部分修改. 本部分采用 Xib 文件来创建用于显示图片的 UIView 对象. 一.简单介绍 Xib 和 storyboard 的比较: 1) X ...
- iOS开发基础-九宫格坐标(2)之模型
在iOS开发基础-九宫格(1)中,属性变量 apps 是从plist文件中加载数据的,在 viewDidLoad 方法中的第20行.26行中,直接通过字典的键名来获取相应的信息,使得 ViewCont ...
- iOS开发基础-图片切换(4)之懒加载
延续:iOS开发基础-图片切换(3),对(3)里面的代码用懒加载进行改善. 一.懒加载基本内容 懒加载(延迟加载):即在需要的时候才加载,修改属性的 getter 方法. 注意:懒加载时一定要先判断该 ...
- iOS开发基础-图片切换(3)之属性列表
延续:iOS开发基础-图片切换(2),对(2)里面的代码用属性列表plist进行改善. 新建 Property List 命名为 Data 获得一个后缀为 .plist 的文件. 按如图修改刚创建的文 ...
随机推荐
- switch case 跳转表
一.事情来源 事情来源是一段奇怪的代码,代码如下 int x = 1000; switch (x) { case 1000: { NSLog(@"%d", 1); } case 2 ...
- U-Boot命令使用
帮助命令 help 所有命令提示: h ? help 某一条命令提示: ? 命令名 help 命令名 信息查询命令 bdinfo 查看板子信息: => bdinfo arch_number = ...
- WIN8 WIN10 WIN11离线安装 .NET 3.5
WIN8 WIN10 WIN11离线安装 .NET 3.5 以WIN10为例: 1.双击WIN10 ISO 镜像,看挂载的是哪个盘符.我这边是E:. 2.使用 WIN + X 快捷键,打开 Windo ...
- 报错解决 :Resolved [org.springframework.web.bind.MissingServletRequestParameterException
报错解决 :Resolved [org.springframework.web.bind.MissingServletRequestParameterException 解决方法:RequestPar ...
- 接口签名规则和Java实现签名和验签代码
接口签名规则和Java实现签名和验签代码 签名规则 签名生成的通用步骤如下: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用U ...
- 通俗理解GAN -- 基础认知
Smiling & Weeping ---- 你已春风摇曳,我仍一身旧雪 1.GAN的基本思想 GAN全称对抗生成网络,顾名思义是生成模型的一种,而他的训练则是一种对抗博弈状态中的.下面我们举 ...
- Linux下安装PHP环境
Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` Linux下安装PHP环境 日期:2018-5-7 阿珏 ...
- 开启PHP-GD库
话不多说,上教程 环境 CentOS7 1. 安装php-gd yum install php-gd 2. 定位gd.so位置 rpm -qal | grep gd.so #第一行即是 3. 定位配置 ...
- CodeFormer一款既能图像修复、还能视频增强去码的AI软件(下载介绍)
CodeFormer是一款强大的人工智能工具,主要用于图像和视频的修复和增强.它基于深度学习技术,特别是人脸复原模型,可以轻松修复和增强面部图像,提升照片和视频的质量和视觉效果 工作原理 1.通过自动 ...
- 详细讲解 Keil Pack Installer,以及通过 Keil 官网获取 Pack
前言 大家好,我是梁国庆. 收到粉丝留言,说 Keil 安装 Pack 不太明白,可不可以详细演示一下? 当然可以有,直接视频+文章全部安排,我就是宠粉. PS:第一次录视频有些紧张,见谅哈. 微信视 ...