iOS开发之SwiftUI

news/2024/7/20 23:06:50 标签: ios, swiftui, cocoa, swift

iOS开发之SwiftUI

iOS开发中SwiftUIObjective-CSwift不同,它采用了声明式语法,相对而言SwiftUI声明式语法简化了界面开发过程,减少了代码量。
由于SwiftUIApple推出的界面开发框架,从iOS13开始引入,Apple使用它的目标是为了打通iOSiPadOSmacOSwatchOStvOS用户界面,保证在不同设备上的一致用户体验(跨平台一致性),所以作为iOS开发不可避免的需要逐步向其过渡。
本文主要通过实际开发去了解SwiftUI的优势和具体实现形式。
iOS开发

实时预览

SwiftUIXcode中提供了实时预览功能,允许开发者在设计阶段就看到界面元素的布局和外观。
这有助于在开发早期发现并修复潜在的问题,从而提高开发效率。

swift">struct ContentView: View {
    var body: some View {
        VStack {
            Spacer()
            Image(systemName: "chart.bar.xaxis.ascending.badge.clock")
                .imageScale(.large)
                .foregroundColor(.mint).scaleEffect(3.0)
            Spacer()
            Text("逝者如斯夫,不舍昼夜!").foregroundColor(.mint).font(.title).fontWeight(.heavy)
        }
        .padding().background {
            SakuraRainView()
        }
    }
}

#Preview {
    ContentView()
}

强大的动画和过渡支持

SwiftUI内置了丰富的动画和过渡效果,使得开发者能够轻松地创建流畅且吸引人的用户界面。
这些动画和过渡效果可以帮助提升应用的用户体验。

swift">struct HexagonShape: Shape {
    var size: CGFloat
      
    func path(in rect: CGRect) -> Path {
        var path = Path()
        let centerX = rect.midX
        let centerY = rect.midY
        let sideLength = size / 2
        
        let angle: CGFloat = CGFloat.pi / 3
        let radius: CGFloat = sideLength / sin(angle / 2)
          
        let points = [
            CGPoint(x: centerX + radius * cos(0 * angle), y: centerY + radius * sin(0 * angle)),
            CGPoint(x: centerX + radius * cos(1 * angle), y: centerY + radius * sin(1 * angle)),
            CGPoint(x: centerX + radius * cos(2 * angle), y: centerY + radius * sin(2 * angle)),
            CGPoint(x: centerX + radius * cos(3 * angle), y: centerY + radius * sin(3 * angle)),
            CGPoint(x: centerX + radius * cos(4 * angle), y: centerY + radius * sin(4 * angle)),
            CGPoint(x: centerX + radius * cos(5 * angle), y: centerY + radius * sin(5 * angle))
        ]
          
        path.move(to: points[0])
        for i in 1..<points.count {
            path.addLine(to: points[i])
        }
        path.closeSubpath()
          
        return path
    }
}

struct SakuraView: View {
    
    @State var animated = false
    @State var opacity = Double.random(in: 0...1)
    @State var offsetX = Double.random(in: -320...320)
    @State var offsetY = Double.random(in: -600...600)
    @State var scale = Double.random(in: 0...2)
    @State var duration = Double.random(in: 1...5)
      
    var body: some View {
        HexagonShape(size: 30)
            .fill([Color.pink, Color.green, Color.blue, Color.yellow][Int.random(in: 0...3)].opacity(opacity))
            .frame(width: 30, height: 30)
            .offset(x:offsetX, y: offsetY)
            .scaleEffect(scale).rotationEffect(.degrees(Double.random(in: 0...360)))
            .animation(.easeInOut(duration: duration).repeatForever(autoreverses: true), value: animated).onAppear {
                opacity = Double.random(in: 0...1)
                offsetX = Double.random(in: -320...320)
                offsetY = Double.random(in: -600...600)
                scale = Double.random(in: 0...2)
                duration = Double.random(in: 1...5)
                animated.toggle()
            }
    }
}

struct SakuraRainView: View {
    let sakuraCount = 200 // 樱花的数量
    @State var animated = false
    @State var offsetX = Double.random(in: -320...320)
    @State var offsetY = Double.random(in: -600...600)
    @State var duration = Double.random(in: 1...5)
      
    var body: some View {
        ZStack {
            ForEach(0..<sakuraCount, id: \.self) { index in
                SakuraView()
                    .offset(x:offsetX, y: offsetY)
                    .animation(.easeInOut(duration: duration), value: animated).onAppear {
                        offsetX = Double.random(in: -320...320)
                        offsetY = Double.random(in: -600...600)
                        duration = Double.random(in: 1...5)
                        animated.toggle()
                    }
            }
        }
    }
}

让我们来看看效果,以下。

SwiftUI动画

与Swift的集成

SwiftUI是基于Swift语言开发的,因此它与Swift的集成非常紧密。
这意味着开发者可以充分利用Swift的强大功能和特性来构建复杂的用户界面。

状态管理

SwiftUI中,状态管理通过使用特定的属性包装器来管理视图的状态。
主要的属性包装器包括@State@Binding
@State用于管理单个视图的局部状态,而@Binding则用于在不同视图之间共享数据。
当状态值改变时,SwiftUI会自动更新UI以反映最新的状态,无需手动操作视图更新。这种自动更新机制极大地简化了状态管理的复杂性,提高了开发效率。
另外,为了确保数据的一致性和可预测性,SwiftUI推荐使用不可变数据结构来管理状态。
通过使用这些属性包装器和不可变数据结构,开发者可以轻松实现视图状态的管理和更新。
一般iOS开发采用第三方库来进行状态管理,比如ReSwift、SwiftUIX等。


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

相关文章

JavaScript es6之前实现继承的方法

1.原型链继承 function Parent() {this.parentProperty true; }function Child() {this.childProperty false; }Child.prototype new Parent();var child new Child(); console.log(child.parentProperty ); // true 优点&#xff1a; 简单直观可以继承原型上的属性和方…

【JavaEE】_Spring MVC项目获取URL中的参数

目录 1. 单参数 2. 多参数 1. 单参数 .java文件如下&#xff1a; package com.example.demo.controller;import com.example.demo.Person; import org.springframework.web.bind.annotation.*;import java.util.Arrays; import java.util.List;RequestMapping("/Para&…

基于Arduino IDE 野火ESP8266模块 EEPROM 存储开发

一、操作存储器 我们可以使用ESP8266模块的EEPROM&#xff0c;也就是可读可擦存储器&#xff0c;可以掉电不丢失地帮我们存储一些数据。ESP8266微控制器有一个闪存区(Flash memory) 来模拟Arduino的EEPROM。这是微控制器中一个特殊的内存位置&#xff0c;即使在主板关闭后&…

车道线检测中的IPM变换

车道线检测中的IPM变换 车道线检测(Lane Detection)是 ADAS 系统中重要的功能模块&#xff0c;而对于 L4 自动驾驶系统来说&#xff0c;在不完全依赖高精度地图的情况下&#xff0c;车道线检测结果也是车辆运动规划的重要输入信息。由于俯视图(BEV, Bird’s Eye View)下做车道…

笔记本电脑与服务器首选:PW1605可编程电流限制开关,稳定可靠新标准

一般描述 PW1605 是一款电流限制开关&#xff0c;具有可编程输入过压保护和输出电压箝位功能。集成保护 N 沟道 FET 具有极低的 RDS&#xff08;ON&#xff09; 功能&#xff0c;PW1605有助于降低正常工作期间的功率损耗。可编程软启动时间控制启动期间输出电压的压摆率。独立的…

【iOS ARKit】播放3D音频

3D音频 在前面系列中&#xff0c;我们了解如何定位追踪用户&#xff08;实际是定位用户的移动设备&#xff09;的位置与方向&#xff0c;然后通过摄像机的投影矩阵将虚拟物体投影到用户移动设备屏幕。如果用户移动了&#xff0c;则通过VIO 和 IMU更新用户的位置与方向信息&…

安全点安全区的通俗理解

想象一下&#xff0c;JVM&#xff08;Java虚拟机&#xff09;是一个忙碌的工厂&#xff0c;而Java程序中的线程就像是工厂里的工人。在这个工厂中&#xff0c;有时需要进行一些大规模的清理工作&#xff0c;比如垃圾回收&#xff0c;来确保工厂运行得更加高效。但是&#xff0c…

网络安全-文件包含

一、php://input 我们先来看一个简单的代码 <meta charset"utf8"> <?php error_reporting(0); $file $_GET["file"]; if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://&quo…