SwiftUI1000问(51-100)
Posted 飞鱼UI研习社
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SwiftUI1000问(51-100)相关的知识,希望对你有一定的参考价值。
题目51:
完成一个悬浮在屏幕右下角距屏幕右侧和底部各20个单位的蓝色"+"按钮。
struct Button : View {
var body : some view{
GeometryReader{geo in
ZStack{
//从底部写起
circle()
.foregroundColor(Color.blue)
.frame(width:70,height:70)
Image(systemName:"plus")
.resizable()
.aspectRatio(contentMode: .fit)
}
.offset(x:geo.size.width - 20, y:geo.size.height - 20)
}
}
}
题目52:
请完成如下效果的代码,当点击蓝色按钮时,图标转动并弹出子按钮,点击左右图标时,切换到不同的视图。
struct ContentView: View{
@State var showPopUp = false
var body: some view{
//GeometryReader会读取它的父视图的尺寸,动态确定tabbar的位置,这里就是全屏幕的尺寸。
GeometryReader{geometry in
VStack{
//两个Spacer()确保Text()一直在中间
Spacer()
if self.viewRouter.currentView == "home" {
Text("Home")
} else if self.viewRouter.currentView == "settings" {
Text("Settings")
}
Spacer()
ZStack{
if self.showPopUp {
PlusMenu()
}
.offset(y: -geometry.size.height/6)
.onTapGesture {
withAnimation {
self.showPopUp.toggle()
}
}
HStack{
Image(systemName: "house")
.resizable()
.aspectRatio(contentMode: .fit)
.padding(20)
.frame(width: geometry.size.width/3, height: 75)
.foregroundColor(self.viewRouter.currentView == "home" ? .black : .gray)
.onTapGesture {
self.viewRouter.currentView = "home"
}
}
ZStack {
Circle()
.foregroundColor(Color.white)
.frame(width: 75, height: 75)
Image(systemName: "plus.circle.fill")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 75, height: 75)
.foregroundColor(.blue)
.rotationEffect(Angle(degrees: self.showPopUp ? 90 : 0))
}
.offset(y: -geometry.size.height/10/2)
Image(systemName: "gear")
.resizable()
.aspectRatio(contentMode: .fit)
.padding(20)
.frame(width: geometry.size.width/3, height: 75)
.foregroundColor(self.viewRouter.currentView == "settings" ? .black : .gray)
.onTapGesture {
self.viewRouter.currentView = "settings"
}
}
.frame(width: geometry.size.width, height: geometry.size.height/10)
.background(Color.white.shadow(radius: 2))
}
}.edgesIgnoringSafeArea(.bottom)
}
}
struct PlusMenu: View {
var body: some View {
HStack(spacing: 50) {
ZStack {
Circle()
.foregroundColor(Color.blue)
.frame(width: 70, height: 70)
Image(systemName: "camera")
.resizable()
.aspectRatio(contentMode: .fit)
.padding(20)
.frame(width: 70, height: 70)
.foregroundColor(.white)
}
ZStack {
Circle()
.foregroundColor(Color.blue)
.frame(width: 70, height: 70)
Image(systemName: "photo")
.resizable()
.aspectRatio(contentMode: .fit)
.padding(20)
.frame(width: 70, height: 70)
.foregroundColor(.white)
}
}.transition(.scale)
}
}
题目53:
请完成如下效果的代码。
struct ContentView: View {
var body: some View {
ZStack(alignment: .bottomTrailing){
Rectangle()
.foregroundColor(.clear)
.frame(maxWidth: .infinity,maxHeight: .infinity)
FloatingButton()
.padding()
}
}
}
struct FloatingButton: View {
@State var showMenuItem1 = false
@State var showMenuItem2 = false
@State var showMenuItem3 = false
var body: some View {
VStack {
Spacer()
if showMenuItem1{
MenuItem(icon: "camera.fill")
}
if showMenuItem2{
MenuItem(icon: "photo.on.rectangle")
}
if showMenuItem3{
MenuItem(icon: "square.and.arrow.up.fill")
}
//.shadow(color:.gray, radius: 0.2,x:1,y:1)
Button(action:{
self.showMenu()
})
{
Image(systemName: "plus.circle.fill")
.resizable()
.frame(width:80,height: 80)
.foregroundColor(Color("mainColor"))
.shadow(color:.gray, radius: 0.2,x:1,y:1)
}
}
}
func showMenu(){
withAnimation{showMenuItem3.toggle()}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.showMenuItem2.toggle()
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
self.showMenuItem1.toggle()
}
}
}
struct FloatingButton_Previews: PreviewProvider {
static var previews: some View {
FloatingButton()
}
}
struct MenuItem: View {
var icon: String
var body: some View {
ZStack{
Circle()
.foregroundColor(Color("smallButton"))
.frame(width:55,height: 55)
Image(systemName: icon)
.imageScale(.large)
.foregroundColor(.white)
}
.transition(.move(edge: .trailing))
}
}
二、新建一个Swift文件,并写进如下代码:
import Foundation
import SwiftUI
import Combine
class ViewRouter: ObservableObject {
@Published var currentView = "home"
}
struct ContentView: View {
@ObservedObject var viewRouter = ViewRouter()
var body: some View {
//...
}}
题目54:
如何控制文字显示行数为2行?无限制行数显示又该如何设置?
.lineLimit(2)//最多显示两行
.lineLimit(nil)//无限行
题目55:
对可选类型进行解包有几种方式?并用相关列子来说明。
对可选类型进行解包就是将可选类型中的值解析出来,一般有三种方式,
一是如果确定可选类型的值不为空的话可以进行强制解包:
var someOptional: String? = "Swift"
print("该可选类型的值为:\(someOptional!)")
二是 用if语句判断解包:
var someOptional: String? = "Swift"
if(someOptional)
{
print("该可选类型的值为:\(someOptional!)")
}else
{
print("该可选类型的值为nil")
}
三是 用 使用guard语句解包:
var someOptional: String? = "Swift"
//guard的意思就是拦截,如果符合条件就直接跳过guard语句进行下面的操作
guard(someOptional == nil)
{
print("该可选类型的值为nil")
}
题目56:
SwiftUI中动画效果可以分为哪几种?如何实现?
可以分为两种,隐式动画和显示动画。隐式动画使用.animation修饰符实现,显示动画使用withAnimation{}实现。
题目57:
请解释以下扩展代码的含义。
extension Character {
enum Kind {
case Vowel, Consonant, Other
}
var kind: Kind {
switch String(self).lowercaseString {
case "a", "e", "i", "o", "u":
return .Vowel
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
return .Consonant
default:
return .Other
}
}}
该例子向Character添加了新的嵌套枚举。这个名为Kind的枚举表示特定字符的类型。具体来说,就是表示一个标准的拉丁脚本中的字符是元音还是辅音(不考虑口语和地方变种),或者是其它类型。这个类子还向Character添加了一个新的计算实例属性,即kind,用来返回合适的Kind枚举成员。现在,这个嵌套枚举可以和一个Character值联合使用了。
题目58:
文字的行间距如何调整?
.lineSpacing(4)
题目59:
什么是计算属性?请写出一个例子并作出说明。
计算属性不直接存储数据,而是从其它存储属性中计算得到数据,例如:
class Employee {
var no:Int = 0
var firstName:String = ""
var lastName:String = ""
var job:String?
var salary:Double = 0
lazy var dept:Department = Department()
//这里的fullname就是计算属性
var fullname:String{
get{
return firstName+"."+"lastName"}
}}
题目60:
什么是UserDefaults?如何使用UserDefaults存储数据,请举例说明。
一般ios应用都会在应用启动时加载已存储的少量的用户设置和偏好,这些数据都是提前存好的,对于这种类型数据一般使用 UserDefaults 进行存储。
可以存储的类型有:数字(Int, Float, Double),字符串,布尔值,数组,字典,日期, Data, URL等。
let defaults = UserDefaults.standard
// 存储// 数字
defaults.set(20, forKey: "Age")
defaults.set(CGFloat.pi, "PI")
// 字符串
defaults.set("James", forKey: "name")
// 布尔值
defaults.set(true, forKey: "isMale")
// 日期
defaults.set(Date(), forKey: "timestamp")
// 数组let arr = ["apple", "banana"]
defaults.set(arr, forKey: "fruit")
// 字典let info = ["country": "china", "name": "james"]
defaults.set(info, forKey: "INFO")
读取相应值时需要对应的字符串值
// 读取let defaults = UserDefaults.standard
// 数字的读取 defaults.integer | defaults.float | defaults.double
defaults.integer(forKey: "Age")
defaults.double(forKey: "PI")
// 字符串读取
defaults.string(forKey: "name")
// 布尔值读取
defaults.bool(forKey: "isMale")
// 对 Date, 数组, 字典的读取,一般使用// defaluts.object(forKey:) -> Any?// 因为数组和字典返回类型分别是 [Any]? , [String: Any]?// 而object返回的是 Any?// 可以自定义转换的类型
defaults.object(forKey: "timestamp") as? Double ?? 0
defaults.object(forKey: "fruit") as? [String] ?? [String]()// 将获取的字典转换为[String:String]类型// 如果获取的字典为nil,则给一个默认字符串字典
defaults.object(forKey: "INFO") as? [String:String] ?? [String:String]()
题目61:
使用UserDefaults读取数据时,如果值不存在,则会返回默认值,不同数据类型的默认值有哪些?
使用 UserDefaults 读取时,如果key不存在,则会返回一个默认值:
integer(forKey:): 如果key存在则返回一个数字类型,如果不存在则返回 0
bool(forKey:): 如果key存在则返回一个布尔值,如果不存在则返回 false
float(forKey:) | double(forKey:): 如果key存在则返回一个浮点数,如果不存在则返回 0.0
object(forKey): 会返回 AnyObject?, 因此你需要自定义转换为你想要的返回类型,比如上面的 UserDefaults.standard.object(forKey: "INFO"), 自定义返回类型为 [String: String], 如果 INFO key 不存在,则给一个默认的空字符串字典 [String:String]()
题目62:
在APP开发中,遇到需要存储大量数据的情况,有哪些解决方案?
对于大量数据一般使用数据库进行存储,比如:
SQLite
fmdb
realm
Core Data
对于结构比较复杂的数据存储,一般会涉及到下面知识:
NSKeyedArchiver & NSkeyedUnarchiver:如果对象是一个属于使用了NSCoding协议的Cocoa类, 可以将数据进行归档(使用NSKeyedArchiver),将数据转换为 Data 类型,然后再使用 UserDefaults 进行存储
Codable 协议:swift新的序列化方式,如果是自定义class,则可以让自定义的class遵循 Codable 协议,然后使用 PropertyListEncoder 对其进行归档
NSCoding| NSSecureCoding:Cocoa Foundation框架中的大部分类采用这个协议,一般使用 NSKeyedArchiver 将对象转换为 NSData类型,使用时,再使用 NSKeyedUnarchiver 将其还原
JSONEncoder & JSONDecoder
题目63:
如何使用UIImagePickerController来操控相机及相册的使用?
//声明一个类型为UIImagePickerController类型的变量
var cameraPicker: UIImagePickerController! = nil
//相机功能
func cameraShow(){
//是否有相机设备
if UIImagePickerController.isValidCameraEnable{
//是否支持相机
if UIImagePickerController.isValidCamera{
//是否支持图片库
if self.cameraPicker == nil{
self.cameraPicker = UIImagePickerController()
self.cameraPicker.sourceType = .camera
self.cameraPicker.delegate = self
self.cameraPicker.setImagePickerStyle(UIColor.yellow(), titleColor.redColor(), buttonTitleColor: UIColor.blackColor())
}
self.presentViewController(self.cameraPicker, animated: true, completion: nil)
}
else{
print("相机打开失败")
}
}
else{
print("没有相机设备")
}
}
题目64:
什么是UIImagePickerController?
UIImagePickerController是UIKit框架下的一个类, 我们可以用UIImagePickerController选择我们所需要的图片和视频。
题目65:
UIImagePickerController下有哪些sourceType属性?
有三种sourceType属性,分别是照相机、相册和照片库。
enum {
UIImagePickerControllerSourceTypePhotoLibrary,
UIImagePickerControllerSourceTypeCamera,
UIImagePickerControllerSourceTypeSavedPhotosAlbum
}
题目66:
使用UIImagePickerController来操控相机及相册需要哪几个步骤?
UIImagePickerController 类来获取图片视频,大体分为以下几个步骤:
1. 初始化UIImagePickerController 类;
2. 设置UIImagePickerController 实例的数据来源类型(下面解释);
3. 设置代理;
4. 如果需要做图片修改的话设置allowsEditing =yes。
题目67:
什么是UIImageView?
UIImageView是一个加载图片的视图,和UILabel一样,都是继承于UIView的。和UILabel不一样的是UILabel是用来显示文字,而UIImageView是用来加载图片的,所有图片都需要放置在UIImageView上才能被加载出来。
题目68:
使用UIImagePickerController来操控相机及相册,具体代码如何写?
class ImageController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{
//图片展示
@IBOutlet weak var image: UIImageView!
var takingPicture:UIImagePickerController!
//点击按钮弹出拍照、相册的选择框
@IBAction func getImage(_ sender: Any) {
let actionSheetController = UIAlertController()
let cancelAction = UIAlertAction(title: "取消", style: UIAlertAction.Style.cancel) { (alertAction) -> Void in
print("Tap 取消 Button")
}
let takingPicturesAction = UIAlertAction(title: "拍照", style: UIAlertAction.Style.destructive) { (alertAction) -> Void in
self.getImageGo(type: 1)
}
let photoAlbumAction = UIAlertAction(title: "相册", style: UIAlertAction.Style.default) { (alertAction) -> Void in self.getImageGo(type: 2)
}
actionSheetController.addAction(cancelAction)
actionSheetController.addAction(takingPicturesAction)
actionSheetController.addAction(photoAlbumAction)
//iPad设备浮动层设置锚点
actionSheetController.popoverPresentationController?.sourceView = sender as? UIView
//显示
self.present(actionSheetController, animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
//去拍照或者去相册选择图片
func getImageGo(type:Int){
takingPicture = UIImagePickerController.init()
if(type==1){
takingPicture.sourceType = .camera
//拍照时是否显示工具栏
//takingPicture.showsCameraControls = true
}else if(type==2){
takingPicture.sourceType = .photoLibrary
}
//是否截取,设置为true在获取图片后可以将其截取成正方形
takingPicture.allowsEditing = false
takingPicture.delegate = self
present(takingPicture, animated: true, completion: nil)
}
//拍照或是相册选择返回的图片
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
takingPicture.dismiss(animated: true, completion: nil)
if(takingPicture.allowsEditing == false){
//原图
image.image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
}else{
//截图
image.image = info[UIImagePickerController.InfoKey.editedImage] as? UIImage
}
}
通俗的解释什么是MVC框架模式?有什么优点?
MVC即model(模型)、view(视图)和controller(控制器)的缩写,是一种软件设计模式,专用于含有图形化用户界面的软件设计,自20世纪80年代以来已经有30多年的历史了。MVC具体指的是:将图形化软件切分成model、view和controller共3个部分:
model:负责数据动态管理和软件业务逻辑,接收来自controller的操作,并将结果及时传递给view。
view:直接呈现在用户面前的信息,比如一张图片或一段文字。
controller:接收来自用户的输入,并转换成相应的命令交给model。
用图片表示最直接:
MVC的优点是:3个部分各司其职、责任明确且耦合性低,很大程度上降低了软件复杂性,从而提高了软件的质量以及开发效率。
题目70:
在MVC模式中,UIViewController代表哪个部分?
UIViewController扮演的正是MVC中的controller。
题目71:
以下SwiftUI中的视图控件与UIKit的对照关系分别是什么?
SwiftUI |
UIKit |
List |
UITableView |
没有类似 |
UICollectionView |
Text |
UILabel |
TextField |
UITextField |
SecureField |
UITextField的isSecureTextEntry=true |
没有类似 |
UITextView |
Toggle |
UISwitch |
Slider |
UISlider |
Button |
UIButton |
NavigationView |
UINavigationController |
Alert |
UIAlertController的style为.alert |
ActionSheet |
UIAlertController的style为.actionSheet |
HStack |
UIStackView水平排列时 |
VStack |
UIStackView 垂直排列时 |
Image |
UIImageView |
SegmentedControl |
UISegmentedControl |
Stepper |
UIStepper |
DatePicker |
UIDatePicker |
没有类似,用Text代替 |
NSAttributedString |
题目72:
如何在SwiftUI中创建UIKit视图和视图控制器?
import SwiftUI
import UIKit
struct PageViewController: UIViewControllerRepresentable {
var controllers: [UIViewController]
}
题目73:
如何使用require关键字?
方法之前加require关键字之后,所有继承该类的子类都要重新实现该方法。
题目74:
struct OtherTabView: View {
@State var showPopUp = false
var body: some View {
//GeometryReader会读取它的父视图的尺寸,动态确定tabbar的位置,这里就是全屏幕的尺寸。
GeometryReader{geometry in
VStack{
//两个Spacer()确保Text()一直在中间
Spacer()
// if self.viewRouter.currentView == "home" {
// Text("Home")
// } else if self.viewRouter.currentView == "settings" {
// Text("Settings")
// }
Text("Home")
Spacer()
ZStack{
if self.showPopUp {
PlusMenu(a: ImageController())
}
}
.offset(y: -geometry.size.height/16)
HStack{
Image("homeTab")
.resizable()
.aspectRatio(contentMode: .fit)
.padding(20)
.frame(width: geometry.size.width/3, height: 75)
.foregroundColor(Color("mainColor"))
// .onTapGesture {
// self.viewRouter.currentView = "home"
ZStack {
//在上面的在下面一层
Circle()
.foregroundColor(Color.white)
.frame(width: 75, height: 75)
Image(systemName: "plus.circle.fill")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 75, height: 75)
.foregroundColor(Color("mainColor"))
.rotationEffect(Angle(degrees: self.showPopUp ? 90 : 0))
}
.offset(y: -geometry.size.height/10/2)
.onTapGesture {
withAnimation {
self.showPopUp.toggle()
}
}
Image("listTab")
.resizable()
.aspectRatio(contentMode: .fit)
.padding(20)
.frame(width: geometry.size.width/3, height: 75)
.foregroundColor(Color("mainColor"))
}
.frame(width: geometry.size.width, height: geometry.size.height/9)
// .background(Color.white.shadow(radius: 4))
}
//
// .onTapGesture {
// self.viewRouter.currentView = "settings"
// }
}.edgesIgnoringSafeArea(.bottom)
//
//
}
// }
// }
//}
题目75:
如何实现3D效果?
GeometryReader{ geometry in
CourseView()
.rotation3DEffect(Angle(
degrees:Double(geometry.frame(in:.global).minX)/-20
),
axis:(x:0, y:10.0,z:0)
)
}
题目76:
在Xcode预览里,.constant是什么意思?
.constant是一个binding类型,绑定了括号里面的值,但是无法改变,相当于一个常量,在preview里经常会用到
.constant(self.image ?? Image("") )
题目77:
SwiftUI下的NavigationView等同于UIKit下的哪个元素?对于放置于NavigationView下的元素有什么要求?
等同于UINavigationController,放入NavigationView下的必须是符合字符串协议的视图,比如Text View。
题目78:
完成如下的按钮动画效果,点击按钮,按钮旋转放大,再次点击,回复原状。
struct animationView : View{
@State var rotate : Bool = false
var body : some view{
Button(action: {
//加到变量的变化上
withAnimation{
self.ratate.toggle()
}
}){
HStack{
Text("动画测试")
Image(systemName: "chevron.right.circle")
.frame(width: 40, height: 40, alignment: .center)
//旋转动画
.rotationEffect(.degrees(rotate ? 90 : 0))
//缩放动画
.scaleEffect(rotate ? 1.5 : 1)
}
}
}
}
题目79:
如何使用修饰符更改文字大小?
除了使用系统已经自定义的修饰符更改文字大小外,还可以自定义文字大小,例如:
.font(.system(size: 25))
题目80:
完成如下视图效果:
struct DataColumn: View {
var color: Color
var height: CGFloat
var body: some View {
VStack {
Spacer()
RoundedRectangle(cornerRadius: 2)
.fill(color)
.frame(width: 4, height: height, alignment: .bottom)
}
}
}
题目81:
都是用来调整边距的,padding()和spacing有什么区别?
padding()作为修饰符用在元素或容器上,给容器或元素frame的内部增加内边距的,spacing作为参数参数用在容器上,给容器内部元素之间增加边距,而各元素frame内的内边距没有增加。
HStack{
}
.padding(.top, 12)
HStack(spacing: 20){
}
题目82:
swift中float与double数据类型都可以用来定义小数?它们有什么区别?
提供了两种有符号的浮点数类型,Double和Float,Float表示32位浮点数,精度要求不高的话可以使用Float类型,例如我们随便写一个小数,2.5; 双精度表示64位浮点数。当需要存储很大或者很高精度的浮点数时,请使用Double类型。
题目83:
什么是jwt?
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519),主要的用途在用户的登录上。
题目84:
什么是同步异步?
同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。 同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。 也就是说,前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。
异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。
题目85:
异步和多线程是什么关系?
异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。换句话说,我们使用多线程来完成异步。
题目86:
SFSymbols是哪种字体的一部分?
SFSymbols是SanFrancisco字体的一部分。
题目87:
SFSymbols图标可以使用哪两种方式来设置大小?
可以使用修饰字体的修饰符.font()和.foregroundColor()来设置大小和颜色外,还可以使用修饰图片的resizable()和.padding()修饰符来调整大小。
题目88:
如何将图片和已有的数据文件,例如:drink.json放入xcode项目中?
只需要把图片拖入到Assets的列表栏中即可。创建好的数据文件例如:drink.json也只需要拖入到最左侧的项目列表中即可使用。
题目89:
var plans: [String] = ["计划1","计划2","计划3","计划4"]
@Binding var showPlan : Bool = false
NavigationView{
List(plans){item in
Toggle(isON: $showPlan){
Text(“附加计划")
}
Text(plans[item])
}
.navigationBarTitle(“设置页面")
}
题目90:
完成如下图所示的界面,当用户点击按钮后图片消失,再点击图片显示。
@State var showAndHide : Bool = false
VStack(spacing: 50){
if showAndHide{
Image("SwiftUI")
.resizable()
.aspectRatio(contentMode:.fill)
.frame(width:170, height:170)
.clipped()
.padding(.top,180)
}
Spacer()
VStack(aligment:.leading,spacing: 10){
Text("I Love SwiftUI")
.font(.largeTitle)
.foreground(Color(.blue))
Text("SwiftUI makes developing iOS apps super easy and fast.")
.font()
}
.frame(width:300, height:100)
Button(action:{self.showAndHide.toggle()})
{
Text("Show me the logo!")
.padding()
.background(Color.blue)
.cornerRadius(10)
.foregroundColor(.white)
}
.padding(.bottom,130)
}
题目91:
SFSymbols是从何时内置于系统中的?
SFSymbols是从iOS 13和macOS10.15开始内置于系统中的。
题目92:
什么是Combine框架?它和SwiftUI是什么关系?
Combine是由纯Swift编写的基于响应式编程,用于处理数据流的框架。SwiftUI依赖Combine来进行背后的数据处理工作。SwiftUI和Combine都是首批Swift系统及框架。
题目93:
请完成图片点击放大、两个手指缩放、三个手指拖拽的效果。
import SwiftUI
struct ContentView: View {
@GestureState private var dragOffset = CGSize.zero
@State private var position = CGSize.zero
@State private var scale: CGFloat = 1.0
var body: some View {
Image("1")
.resizable()
.aspectRatio(contentMode: .fit)
.offset(x: position.width + dragOffset.width, y: position.height + dragOffset.height)
.animation(.easeInOut)
.scaleEffect(scale)
// 缩放
.gesture(MagnificationGesture()
.onChanged { value in
self.scale = value.magnitude
}
)
// 拖拽
.gesture(
DragGesture()
.updating($dragOffset, body: { (value, state, transaction) in
state = value.translation
})
.onEnded({ (value) in
self.position.height += value.translation.height
self.position.width += value.translation.width
})
)
//点击放大
.gesture(
TapGesture()
.onEnded { _ in
self.scale += 0.1
print("\(self.scale)")
}
)
}}
题目94:
要将文字变成粗体,需要使用哪个修饰符?
//需要使用.fontWeight修饰符,其中的.black还可以替换为.bold等参数,但从效果上来看.black修饰的文字效果是最粗的。
.fontWeight(.black)
题目95:
请通俗的解释什么闭包?闭包主要的额用途有哪些?
闭包就是匿名函数,Swift允许我们像字符串和整数一样使用函数。具体来说,你可以创建一个函数然后把它赋给一个变量,利用那个变量来调用函数。你甚至可以把函数作为参数传给另一个函数。
函数的这种用法被称为闭包 。
在使用方面,我们可用swift的闭包来定义变量的值,其实就是用闭包的形式写一个计算属性。例如:
//可以在闭包中设置get、set、willset、didiset方法。
var someString : String ={
return "a string"
}()
//可以直接省略等号和参数括号
var someString : String{
return "a String"
}
题目96:
.border(边框)修饰符如何使用?
//边框为红色,1个单位宽度
.border(Color.red, width: 1)
题目97:
旋转动画效果如何实现?
使用.rotationEffect修饰符来实现。
.rotationEffect(.degrees(90))
题目98:
.animation除了线性的效果之外,还有哪些效果?
除了线性效果外,还包括 .easeIn(一开始慢,之后变快), .easeOut(一开始快,之后变慢), .easeInOut(开始结束都慢)和.timingCurve效果。
题目99:
创建一个按钮,每点击按钮一次,按钮放大一倍,并给缩放过程加上动画。
//用scale来实现缩放
var scale : CGFloat = 1
Button(action:{
self.scale += 1
}){
Text("点击")
}
.scaleEffect(scale)
//.animation只是用来定义动画效果的,比如线性、3秒钟等
.animation(.linear(duration: 3))
题目100:
如何让图片平铺满整个容器?
Image("YourImage")
.resizable(capInsets: EdgeInsets(top: 20, leading: 20, bottom: 20, trailing: 20), resizingMode: .tile)
以上是关于SwiftUI1000问(51-100)的主要内容,如果未能解决你的问题,请参考以下文章