IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Swift动画 —— 链接动画 -> 正文阅读

[移动开发]Swift动画 —— 链接动画

首先声明两个Label

    let titleLabel = UILabel()
    let bodyLabel = UILabel()

在viewDidLoad中,将titleLabel和bodyLabel的属性设置好,然后创建一个StackView,将两个label放在里面,UIStackView是一个简化的界面,用于帮助程序猿将一队视图按竖直或者水平排列。将stackView设置为竖直排列,并将其放在视图中间。

titleLabel.backgroundColor = .red
bodyLabel.backgroundColor = .green
titleLabel.text = "title"
bodyLabel.text = "body"

let stackView = UIStackView(arrangedSubviews: [titleLabel,bodyLabel])
view.addSubview(stackView)

stackView.axis  = .vertical
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

现在运行后,发现两个标签一上一下显示在屏幕中间了。
在这里插入图片描述
为标签添加一些有意义的字,并且改变字体大小,然后给stackView一个宽度。

titleLabel.backgroundColor = .red
titleLabel.text = "welcome to  company XYZ,"
titleLabel.numberOfLines = 0
titleLabel.font = UIFont(name: "Futura", size: 34)

bodyLabel.backgroundColor = .green
bodyLabel.text = "Hello there! Thanks so much for downloading our brand new app and giving us a try. Make sure to leave us a good review in the AppStore."
bodyLabel.numberOfLines  = 0

let stackView = UIStackView(arrangedSubviews: [titleLabel,bodyLabel])
view.addSubview(stackView)

stackView.axis  = .vertical
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
stackView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.8).isActive = true

在这里插入图片描述
用refactor将两个label的设置和stackView的设置分离出去变为两个方法,接下来就可以开始写链接动画了。

为view添加一个点击手势

        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))

添加响应方法,这样运行后发现titleLabel会先向左移30,然后向上移动后消失。这里的参数:

  • duration:表示动画执行时间。
  • delay:动画延迟时间。
  • usingSpringWithDamping: 参数的范围为0.0f到1.0f,数值越小「弹簧」的振动效果越明显。可以视为弹簧的劲度系数
  • initialSpringVelocity: 表示动画的初始速度,数值越大一开始移动越快。
  • options:可选项,一些可选的动画效果,包括重复等。
  • animations:表示执行的动画内容,包括透明度的渐变,移动,缩放。
  • completion:表示执行完动画后执行的内容。
    @objc func handleTap() {
    UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseOut) {
            self.titleLabel.transform = CGAffineTransform(translationX: -30, y: 0)
        } completion: { (_) in
            UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
                self.titleLabel.transform =  self.titleLabel.transform.translatedBy(x: 0, y: -200)
                self.titleLabel.alpha = 0
            }, completion: nil)
        }
    }

为bodyLabel也添加上动画,设置延迟为0.5秒。

  UIView.animate(withDuration: 0.5, delay: 0.5, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseOut) {
            self.bodyLabel.transform = CGAffineTransform(translationX: -30, y: 0)
        } completion: { (_) in
            UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
                self.bodyLabel.transform =  self.bodyLabel.transform.translatedBy(x: 0, y: -200)
                self.bodyLabel.alpha = 0
            }, completion: { (_) in
                self.view.isUserInteractionEnabled = true
            })
        }

这样一个链式动画就完成啦。
完整代码

import UIKit

class ViewController: UIViewController {

    let titleLabel = UILabel()
    let bodyLabel = UILabel()
    fileprivate func setupLabels() {
        // Do any additional setup after loading the view.
        
        titleLabel.text = "welcome to  company XYZ,"
        titleLabel.numberOfLines = 0
        titleLabel.font = UIFont(name: "Futura", size: 34)
        
        bodyLabel.text = "Hello there! Thanks so much for downloading our brand new app and giving us a try. Make sure to leave us a good review in the AppStore."
        bodyLabel.numberOfLines  = 0
    }
    
    fileprivate func setUpViews() {
        let stackView = UIStackView(arrangedSubviews: [titleLabel,bodyLabel])
        view.addSubview(stackView)
        
        stackView.axis  = .vertical
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        stackView.spacing = 8
        stackView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.8).isActive = true
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupLabels()
        
        setUpViews()
        
        
        // animation
        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))
    }
    
    @objc func handleTap() {
        view.isUserInteractionEnabled = false
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseOut) {
            self.titleLabel.transform = CGAffineTransform(translationX: -30, y: 0)
        } completion: { (_) in
            UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
                self.titleLabel.transform =  self.titleLabel.transform.translatedBy(x: 0, y: -200)
                self.titleLabel.alpha = 0
            }, completion: nil)
        }
        
        UIView.animate(withDuration: 0.5, delay: 0.5, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseOut) {
            self.bodyLabel.transform = CGAffineTransform(translationX: -30, y: 0)
        } completion: { (_) in
            UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
                self.bodyLabel.transform =  self.bodyLabel.transform.translatedBy(x: 0, y: -200)
                self.bodyLabel.alpha = 0
            }, completion: { (_) in
                self.view.isUserInteractionEnabled = true
            })
        }

    }


}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-06 12:20:40  更:2021-10-06 12:20:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 14:36:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码