CustomShapes/自定义形状, CustomCurves/自定义曲线, AnimateableData/数据变化动画 的使用

news/2024/7/20 22:34:18 标签: iOS, Swift, UI

1. CustomShapes 自定义形状视图

  1.1 资源图文件 therock.png

  1.2 创建自定义形状视图 CustomShapesBootcamp.swift

Swift">import SwiftUI

/// 三角形
struct Triangle: Shape{
    func path(in rect: CGRect) -> Path {
        Path { path in
            path.move(to: CGPoint(x: rect.midX, y: rect.minY))
            path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY))
            path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY))
            path.addLine(to: CGPoint(x: rect.midX, y: rect.minY))
        }
    }
}

/// 菱形
struct Diamond: Shape{
    func path(in rect: CGRect) -> Path {
        Path { path in
            let horizontalOffset: CGFloat = rect.width * 0.2
            path.move(to: CGPoint(x: rect.midX, y: rect.minY))
            path.addLine(to: CGPoint(x: rect.maxX - horizontalOffset, y: rect.midY))
            path.addLine(to: CGPoint(x: rect.midX, y: rect.maxY))
            path.addLine(to: CGPoint(x: rect.minX + horizontalOffset, y: rect.midY))
            path.addLine(to: CGPoint(x: rect.midX, y: rect.minY))
        }
    }
}

/// 梯型
struct Trapezoid: Shape{
    func path(in rect: CGRect) -> Path {
        Path { path in
            let horizontalOffset: CGFloat = rect.width * 0.2
            //let verticalOffset: CGFloat = rect.height * 0.58
            let verticalOffset: CGFloat = rect.height * 0.2
            path.move(to: CGPoint(x: rect.minX + horizontalOffset, y: rect.minY + verticalOffset))
            path.addLine(to: CGPoint(x: rect.maxX - horizontalOffset, y: rect.minY + verticalOffset))
            path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY))
            path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY))
            path.addLine(to: CGPoint(x: rect.minX + horizontalOffset, y: rect.minY + verticalOffset))
        }
    }
}

/// 自定义形状
struct CustomShapesBootcamp: View {
    var body: some View {
        VStack(spacing: 20) {
            // triangleView
            // imageView
             diamondView
             trapezoidView
        }
    }
    
    /// 三角形
    var triangleView: some View{
        Triangle()
            .stroke(style: StrokeStyle(lineWidth: 5, lineCap: .round, dash: [10]))
            //.trim(from: 0, to: 0.5)
            .foregroundColor(.accentColor)
            .frame(width: 300, height: 300)
    }
    
    /// 图片设置
    var imageView: some View{
        Image("therock")
            .resizable()
            .scaledToFill()
            .frame(width: 300, height: 300)
            .clipShape(Triangle().rotation(Angle(degrees: 180)))
    }
    
    /// 菱形
    var diamondView: some View{
        Diamond()
            //.trim(from: 0, to: 0.5)
            .fill(LinearGradient(gradient: Gradient(colors: [Color.red, Color.blue]), startPoint: .leading, endPoint: .trailing))
            .frame(width: 300, height: 300)
    }
    
    /// 梯形
    var trapezoidView: some View{
        Trapezoid()
            .frame(width: 300, height: 300 * 0.5)
    }
}

struct CustomShapesBootcamp_Previews: PreviewProvider {
    static var previews: some View {
        CustomShapesBootcamp()
    }
}

  1.3 效果图:

       

2. CustomCurves 自定义曲线视图

  2.1 创建自定义曲线视图 CustomCurvesBootcamp.swift

Swift">import SwiftUI

/// 自定义曲线
struct CustomCurvesBootcamp: View {
    var body: some View {
        VStack(spacing: 20) {
            //arcSampleView
            //shapeWithArcView
            //quadSampleView
            waterView
        }
    }
    
    /// 弧形样本
    var arcSampleView :some View{
        ArcSample()
            .stroke(lineWidth: 5)
            .frame(width: 200, height: 200)
    }
    ///  弧形形状
    var shapeWithArcView: some View{
        ShapeWithArc()
            .frame(width: 200, height: 200)
            //.rotationEffect(Angle(degrees: 90))
    }
    /// 四边曲线样本
    var quadSampleView: some View{
        QuadSample()
            .frame(width: 200, height: 200)
            .padding(.top, 30)
    }
    /// 水波浪
    var waterView: some View{
        WaterShape()
            .fill(LinearGradient(
                gradient: Gradient(colors: [Color(#colorLiteral(red: 0.2196078449, green: 0.007843137719, blue: 0.8549019694, alpha: 1)), Color(#colorLiteral(red: 0.06274510175, green: 0, blue: 0.1921568662, alpha: 1))]),
                startPoint: .topLeading,
                endPoint: .bottomTrailing))
            .ignoresSafeArea()
    }
}

struct CustomCurvesBootcamp_Previews: PreviewProvider {
    static var previews: some View {
        CustomCurvesBootcamp()
    }
}

/// 弧形样本
struct ArcSample: Shape{
    func path(in rect: CGRect) -> Path {
        Path { path in
            path.move(to: CGPoint(x: rect.maxX, y: rect.midY))
            path.addArc(
                center: CGPoint(x: rect.midX, y: rect.midY),
                radius: rect.height / 2,
                startAngle: Angle(degrees: 0),
                endAngle: Angle(degrees: 40),
                clockwise: true)
        }
    }
}

/// 弧形形状
struct ShapeWithArc: Shape{
    func path(in rect: CGRect) -> Path {
        Path { path in
            // 上 左
            path.move(to: CGPoint(x: rect.minX, y: rect.minY))
            // 上 右
            path.addLine(to: CGPoint(x: rect.maxX, y: rect.minY))
            // 中 右
            path.addLine(to: CGPoint(x: rect.maxX, y: rect.midY))
            // 下
            path.addArc(
                center: CGPoint(x: rect.midX, y: rect.midY),
                radius: rect.height * 0.5,
                startAngle: Angle(degrees: 0),
                endAngle: Angle(degrees: 180),
                clockwise: false)
            //path.addLine(to: CGPoint(x: rect.midX, y: rect.maxY))
            // 中 左
            path.addLine(to: CGPoint(x: rect.minX, y: rect.midY))
        }
    }
}

/// 四边曲线形样本
struct QuadSample: Shape{
    func path(in rect: CGRect) -> Path {
        Path { path in
            path.move(to: .zero)
            // 添加四边形曲线
            path.addQuadCurve(
                to: CGPoint(x: rect.midX, y: rect.midY),
                control: CGPoint(x: rect.maxX - 50, y: rect.minY - 100))
        }
    }
}

/// 水波浪形状
struct WaterShape: Shape{
    func path(in rect: CGRect) -> Path {
        Path { path in
            path.move(to: CGPoint(x: rect.minX, y: rect.midY))
            // 添加四边形曲线
            path.addQuadCurve(
                to: CGPoint(x: rect.midX, y: rect.midY),
                control: CGPoint(x: rect.width * 0.25, y: rect.height * 0.40))
            
            path.addQuadCurve(
                to: CGPoint(x: rect.maxX, y: rect.midY),
                control: CGPoint(x: rect.width * 0.75, y: rect.height * 0.60))
            
            path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY))
            path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY))
        }
    }
}

  2.2 效果图:

       

3. AnimateableData 根据数据的变化设置动画效果

  3.1 创建数据变化的动画 AnimateableDataBootcamp.swift

Swift">import SwiftUI

/// 数据变化动画
struct AnimateableDataBootcamp: View {
    @State private var animate: Bool = false
    
    var body: some View {
        // rectangleWithSingleCornerAnimation
        pacmanView
    }
    
    /// 一个圆角的矩形动画 View
    var rectangleWithSingleCornerAnimation: some View{
        ZStack {
            // RoundedRectangle(cornerRadius: animate ? 60 : 0)
            RectangleWithSingleCornerAnimation(cornerRadius: animate ? 60 : 0)
                .frame(width: 250, height: 250)
        }
        .onAppear {
            // 添加动画
            withAnimation(Animation.linear(duration: 2.0).repeatForever()) {
                animate.toggle()
            }
        }
    }
    
    /// 吃豆人动画
    var pacmanView: some View{
        Pacman(offsetAmount: animate ? 20 : 0)
            .frame(width: 250, height: 250)
            .onAppear {
                // 添加动画
                withAnimation(Animation.easeInOut.repeatForever()) {
                    animate.toggle()
                }
            }
    }
}

/// 一个圆角的矩形动画
struct RectangleWithSingleCornerAnimation :Shape{
    var cornerRadius: CGFloat
    
    // 自带动画数据
    var animatableData: CGFloat {
        get { cornerRadius }
        set { cornerRadius = newValue }
    }
    
    func path(in rect: CGRect) -> Path {
        Path { path in
            path.move(to: .zero)
            path.addLine(to: CGPoint(x: rect.maxX, y: rect.minY))
            path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY - cornerRadius))
            // 添加曲线
            path.addArc(
                center: CGPointMake(rect.maxX - cornerRadius, rect.maxY - cornerRadius),
                radius: cornerRadius,
                startAngle: Angle(degrees: 0),
                endAngle: Angle(degrees: 360),
                clockwise: false)
            path.addLine(to: CGPoint(x: rect.maxX - cornerRadius, y: rect.maxY))
            path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY))
        }
    }
}

/// 吃豆人动画
struct Pacman: Shape{
    var offsetAmount: Double
    
    var animatableData: Double{
        get{ offsetAmount }
        set{ offsetAmount = newValue}
    }
    
    func path(in rect: CGRect) -> Path {
        Path { path in
            path.move(to: CGPoint(x: rect.midX, y: rect.minY))
            path.addArc(
                center: CGPoint(x: rect.midX, y: rect.minY),
                radius: rect.height * 0.5,
                startAngle: Angle(degrees: offsetAmount),
                endAngle: Angle(degrees: 360 - offsetAmount),
                clockwise: false)
        }
    }
}

struct AnimateableDataBootcamp_Previews: PreviewProvider {
    static var previews: some View {
        AnimateableDataBootcamp()
    }
}

  3.2 效果图:

       


http://www.niftyadmin.cn/n/5090770.html

相关文章

汇编经典程序——将一个字节数据以十六进制形式显示

法一: 由于0-9的ASCII码实际值30h,A-Z的ASCII码实际值37h,故直接加对应的数即可 ;该程序将一个字节数据以十六进制形式显示(直接加对应数值).model small .stack .data hex db 4bh.code .startup;显示高位mov al,hex…

4、在docker容器内的tomcat 中发布项目

1、查看本地是否有tomcat镜像,如果不存在则去下载 docker images 2、查看本地是否有tomcat容器,如存在跳过第3步 docker ps 3、创建tomcat容器 此容器用于复制tomcat的配置文件,配置文件复制后需删除此容器,如果已经存在跳过此步…

红队专题-从零开始VC++远程控制软件RAT-C/S-[3]客户端与服务端连接

红队专题 招募六边形战士队员OnBeginListen 函数Common头文件新建项结构体宏定义 m_Mysocket C类的编写添加C类 itemData调用继承消息传递函数上线信息下线使用消息宏声明消息处理函数ShowOnLine()GetSocket()PlaySoundW 招募六边形战士队员 一起学习 代码审计、安全开发、web…

Java线程安全问题

1、什么是线程安全问题 2、用程序模拟线程安全问题 代码说明: Account代表账户类DrawThread代表线程类ThreadTest运行线程类 Account类: package ThreadSave;public class Account {private double money; //余额private String cardId; //卡号publi…

基于音频SOC开发板的主动降噪ANC算法源码实现

基于音频SOC开发板的主动降噪ANC算法源码实现 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群附加赠送降噪开发资料,

springboot+vue+java付费自习室选座系统nl1u1

本系统从用户的角度出发,结合当前的环境而开发的,在开发语言上是使用的Java语言,在框架上我们是使用的springboot框架,数据库方面使用的是MySQL数据库,开发工具为IDEA。 付费自习室管理系统根据实际情况分为前后台两部…

Windows:Arduino IDE 开发环境配置【保姆级】

参考官网:Arduino - Home Arduino是一款简单易学且功能丰富的开源平台,包含硬件部分(各种型号的Arduino开发板)和软件部分(Arduino IDE)以及广大爱好者和专业人员共同搭建和维护的互联网社区和资源。 Arduino IDE软件…

Android---DVM以及ART对JVM进行优化

Dalvik Dalvik 是 Google 公司自己设计用于 Android 平台的 Java 虚拟机,Android 工程师编写的 Java 或者 Kotlin 代码最终都是在这台虚拟机中被执行的。在 Android 5.0 之前叫作 DVM,5.0 之后改为 ART(Android Runtime)。在整个…