38 SwiftUI

简介: SwiftUI

SwiftUI

image.png

  • SwiftUI 是一种基于Swift的强大能力,简单创新的构建用户界面的方法,并且可以运行在苹果所有的平台上

image.png

SwiftUI - 声明式语法

  • SwiftUI采用声明式语法,因为你可以简单声明你的用户界面

image.png

  • Xcode11提供了强大的设计工具,可以通过简单的拖拽用SwiftUI生成用户界面

image.png

  • 只需要描述一次的布局-为你的视图声明任何状态的内容和布局,一旦状态发生改变,SwiftUI会自动更新视图的渲染
  • 构建可复用的组件-将小型、独立视图组合到更大,更复杂的界面中。在任何为Apple平台所设计的应用之间,共享您的自定义视图
  • 精简动画-创建平滑的动画就像调用单个方法一样简单。SwiftUI会在必要时自动计算并过渡动画


SwiftUI设计工具使用指南

创建项目

image.png

Stacks

image.png

如何使用SwiftUI构建可复用的组件

地标页例子

image.png

Image组件

image.png

image.png

image.pngimage.png


structContentView: View {
varbody: someView {
VStack {
//设置安全距离MapView().edgesIgnoringSafeArea(.all)
                .frame(height: 300)
CircleImage().offset(y: -130).padding(.bottom, -130)
//左对齐VStack (alignment: .leading) {
Text("圆明园").font(.title)
HStack {
Text("皇家园林").font(.subheadline)
Spacer()
Text("北京").font(.subheadline)
                }
            }.padding()//边界留白Spacer()//留白        }
    }
}

图片组件

structCircleImage: View {
varbody: someView {
//将图片剪切出一个圆Image("ymy").clipShape(Circle())
//加一个边框线        .overlay(Circle().stroke(Color.black, lineWidth: 4))
        .shadow(radius: 10)//阴影    }
}

地图组件

importSwiftUIimportMapKitstructMapView; UIViewRepresentable {
//创建地图组件funcmakeUIView(context: Context) ->MKMapView {
returnMKMapView(frame: .zero)
    }
//对地图组件进行设置funcupdateUIView(_uiView: MKMapView, context: Context) {
//圆明园的经纬度letlocation=CLLocationCoordinate2D(latitude: 40.00491139888854, longitude: 116.2896180152893)
//展示范围letspan=MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5)
letregion=MKCoordinateRegion(center: location, span: span)
uiView.setRegion(region, animated: true)
    }
}

如何使用SwiftUI实现动画

SwiftUI - 动画

  • 在SwiftUI中,你可以将任意的改变过程封装进一个withAnimation块中。默认,SwiftUI会对这种改变采用fade in/out 的方式进行动画
structAnimationView: View {
//状态 当属性改变时, 会进行重写渲染@StateprivatevarshowDetail=falsevarbody: someView {
Button(action: {
withAnimation {
self.showDetail=!self.showDetail            }
        }) {
Image(systemName: "chevron.right.circle")//使用了一张系统图片                .imageScale(.large)//尺寸                .rotationEffect(.degrees(showDetail?90 : 0))//旋转90度或0度                .scaleEffect(showDeatil?1.5 : 1)//放大倍数            .padding()
        }
    }
}

在这里更改显示入口

image.png

深入理解SwiftUI:实现原理探秘

@propertyWrapper

  • 通过property Wrapper机制,对一些类似的属性的实现代码做同一封装
  • 通过@propertyWrapper可以移除掉一些重复或者类似的代码

@state

  • 通过@State SwiftUI 实现了值的绑定、动态查找和View的自动重现绘制

image.png

image.png

  • 课后题:查看源码,了解@Binding,@ObservedObject,@EnvironmentObject等装饰器的作用
extensionUserDefaults {
publicenumKeys {
staticlethadShownUserGuide="hadShownUserGuide"    }
varhadShownUserGuide: Bool {
set {
set(newValue, forKey: Keys.hadShownUserGuide)
        }
get {
bool(forKey: Keys.hadShownUserGuide)
        }
    }
}
structPropertyWrapperView: View {
@StateprivatevarshowText=UserDefaults.standard.hasShownUserGuide?"已经展示" : "没有展示过"varbody: someView {
Button(action: {
if (!UserDefaults.standard.hasShownUserGuide) {
UserDefaults.standard.hasShownUserGuide=trueself.showText="已经展示"            }
        }) {
Text(self.showText)
        }
    }
}
  • 使用propertyWrapper进行统一扩展
@propertyWrapperstructUserDefaultsWrapper<T> {
varkey: StringvardefaultValue : Tinit(_key: String, defaultValue: T) {
self.key=keyself.defaultValue=defaultValue    }
varwrappedValue: T {
get {
returnUserDefaults.standard.value(forKey: key) as?T??defaultValue        }
set {
UserDefaults.standard.set(newValue, forKey: key)
        }
    }
}
structPropertyWrapperView: View {
@UserDefaultsWrapper("hadShownUserGuide", defaultValue: false)
staticvarhadShownUserGuide : Bool@StateprivatevarshowText=PropertyWrapperView.hasShownUserGuide?"已经展示" : "没有展示过"varbody: someView {
Button(action: {
if (!PropertyWrapperView.hasShownUserGuide) {
PropertyWrapperView.hasShownUserGuide=trueself.showText="已经展示"            }
        }) {
Text(self.showText)
        }
    }
}








目录
相关文章
|
存储 iOS开发
SwiftUI极简教程17:Gestures手势的使用
SwiftUI极简教程17:Gestures手势的使用
1007 0
SwiftUI极简教程17:Gestures手势的使用
SwiftUI—快速制作一个缩放动画
SwiftUI—快速制作一个缩放动画
993 0
SwiftUI—快速制作一个缩放动画
|
2月前
|
开发框架 数据可视化 Java
iOS开发-SwiftUI简介
iOS开发-SwiftUI简介
|
12天前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
2月前
|
iOS开发 开发者 UED
探索iOS应用开发中的SwiftUI框架
【9月更文挑战第26天】 在iOS开发的海洋中,SwiftUI犹如一艘现代的快艇,引领着开发者们驶向更加高效与直观的编程体验。本文将带你领略SwiftUI的魅力,从其设计理念到实际应用,我们将一步步揭开它如何简化界面构建过程的面纱。通过对比传统方式,你将看到SwiftUI如何让代码变得像诗一样优美,同时保持强大的功能性和灵活性。准备好让你的iOS开发技能加速升级,一起驾驭这股新潮流吧!
|
4月前
|
API 数据处理 开发工具
探索iOS开发的未来:SwiftUI和Combine的融合
【7月更文挑战第23天】随着Apple不断推动其软件开发工具的创新,SwiftUI和Combine框架的出现标志着iOS开发进入了一个新的时代。本文将深入探讨这两个框架如何简化界面设计和事件处理,以及它们如何共同为开发者提供一个更加高效、声明式的编程模型。我们将通过实际示例来展示如何利用SwiftUI构建用户界面,并使用Combine处理异步事件和状态管理。文章还将预测这些技术如何塑造iOS应用开发的未来趋势。
|
3月前
SwiftUI
【8月更文挑战第3天】
35 4
|
3月前
|
Swift iOS开发 开发者
探索iOS开发:SwiftUI的魔力
【8月更文挑战第30天】在这篇文章中,我们将一起揭开SwiftUI的神秘面纱,这是Apple为iOS开发者带来的一种创新和简化界面设计的框架。通过直观易懂的语言和实际案例,我们会深入探讨SwiftUI如何让代码变得像诗一样优美,同时提升开发效率。你将看到,即便是编程初学者也能迅速上手,构建出令人惊叹的应用界面。让我们跟随SwiftUI的步伐,开启一段高效、愉悦的开发旅程。
|
4月前
|
移动开发 前端开发 iOS开发
探索iOS开发的未来:SwiftUI与Combine的融合
随着苹果公司不断推进其操作系统的更新,iOS开发领域也迎来了诸多变革。在这篇文章中,我们将深入探讨SwiftUI和Combine这两个强大的框架,它们如何共同塑造着iOS应用开发的未来趋势。通过具体实例和数据支持,本文旨在揭示这些技术如何简化开发者的工作流,提升用户界面构建的效率,以及加强应用的响应性和性能表现。我们还将提出一个开放性问题,邀请读者思考并探索这些技术在未来可能带来的进一步影响。 【7月更文挑战第26天】
52 2
|
6月前
|
API iOS开发 UED
SwiftUI 设计
SwiftUI 设计
76 2