ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SwiftUI 简明教程之按钮等控件

2021-05-09 16:05:23  阅读:240  来源: 互联网

标签:控件 教程 自定义 Color Button label SwiftUI ButtonStyle configuration


本文为 Eul 样章,如果您喜欢,请移步 AppStore/Eul 查看更多内容。

Eul 是一款 SwiftUI & Combine 教程类 App(iOS、macOS),以文章(文字、图片、代码)配合真机示例(Xcode 12+、iOS 14+,macOS 11+)的形式呈现给读者。笔者意在尽可能使用简洁明了的语言阐述 SwiftUI & Combine 相关的知识,使读者能快速掌握并在 iOS 开发中实践。

Button

构建方法

Button 的构建主要有以下两种方法:

// 1、字符串构建,支持本地化字符串
Button("Hello World") {
  // action
}

// 2、自定义样式
Button {
  // action
} label: {
  VStack(spacing: 8) {
    Image(systemName: "square.and.arrow.up")
    Text("Share")
  }
  .padding()
  .foregroundColor(.white)
  .background(Color.blue)
  .cornerRadius(10)
  .shadow(color: Color.black.opacity(0.35), radius: 5, x: 0, y: 5)
}

自定义 ButtonStyle

系统提供了六种 ButtonStyle,其中只有 DefaultButtonStylePlainButtonStyleBorderlessButtonStyle 是用于 iOS 系统的。但是我们可以通过以下两个协议自定义样式:

  • ButtonStyle :支持自定义样式

  • PrimitiveButtonStyle :支持自定义样式和交互

这两个协议的定义几乎一样,唯一的区别是 ButtonStyle 内部有一个 Bool 类型的属性 isPressed,而 PrimitiveButtonStyle 内部有一个 trigger() 方法供我们自己手动调用。

下面我们通过实例来加深了解,我们先定义一个遵循 ButtonStyle 协议的 ShadowButtonStyle,它可以给按钮添加带圆角的阴影,使按钮在按下时改变字体和背景。

如果一个视图内部有多个 Button,我们只需要在调用一次 .buttonStyle(ShadowButtonStyle()),系统会通过环境变量将该样式注入各个子视图。

struct ShadowButtonStyle: ButtonStyle {
  func makeBody(configuration: Configuration) -> some View {
    configuration.label
      .foregroundColor(configuration.isPressed ? .gray : .white)
      .padding()
      .background(configuration.isPressed ? Color.purple : Color.blue)
      .cornerRadius(10)
      .shadow(color: Color.black.opacity(0.35), radius: 5, x: 0, y: 5)
  }
}

HStack {
  Button("Hello") {}
  Button("World") {}
}
.buttonStyle(ShadowButtonStyle())

然后我们定义一个遵循 PrimitiveButtonStyleDoubleTapButtonStyle,它表示按钮受到双击时,才会触发点击事件。代码如下:

struct DoubleTapButtonStyle: PrimitiveButtonStyle {
  func makeBody(configuration: Configuration) -> some View {
    configuration.label
      .gesture(TapGesture(count: 2).onEnded { configuration.trigger() })
  }
}

Button("Double Tap") { print("Tapped ") }
  .foregroundColor(.white)
  .padding()
  .background(Color.blue)
  .cornerRadius(10)
  .buttonStyle(DoubleTapButtonStyle())

EditButton

系统提供了一个快速构建编辑功能的按钮:EditButton ,它的功能和使用场景比较单一,按下的时候会进入编辑状态,按钮文字变成 "Done" ,再次按下变回 "Edit",主要和 List 配合使用,通常这样调用: .navigationBarItems(trailing: EditButton())

构建方法

Menu 用于快速构建菜单视图,有如下两种构建方法:

// 1、字符串构建
Menu("More") {
  Button("Add") {}
  Button("Edit") {}
  Button("Delete") {}
}

// 2、自定义构建
Menu {
  Button {} label: {
    Label("Add", systemImage: "plus")
  }
  
  Button {} label: {
    Label("Edit", systemImage: "pencil")
  }
  
  Button {} label: {
    Label("Delete", systemImage: "minus.circle")
  }
  
  // 只要是 View 类型皆可,这里使用了 Picker
  Picker("Picker", selection: $selection) {
    Text("Item1").tag(0)
    Text("Item1").tag(1)
    Text("Item1").tag(2)
  }
} label: {
  Text("More")
  Image(systemName: "ellipsis")
}

自定义 MenuStyle

遵循 MenuStyle 协议并实现相应的方法,样例代码如下:

struct BorderMenuStyle: MenuStyle {
  func makeBody(configuration: Configuration) -> some View {
    Menu(configuration)
      .foregroundColor(.blue)
      .padding(3)
      .border(Color.blue, width: 2)
  }
}

// 使用
Menu("BorderMenuStyle") {
  Button("Add") {}
  Button("Edit") {}
  Button("Delete") {}
}
.menuStyle(BorderMenuStyle())


Link 可以用来打开网页链接,如果通用链接(Universal Link)支持,会跳转到对应的 App 页面。

NavigationLink 用于 App 的页面导航,使用简单,详见文档

本文为 Eul 样章,如果您喜欢,请移步 AppStore/Eul 查看更多内容。

标签:控件,教程,自定义,Color,Button,label,SwiftUI,ButtonStyle,configuration
来源: https://www.cnblogs.com/bruce2077/p/14748015.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有