经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
SwiftUI 简明教程之按钮等控件
来源:cnblogs  作者:Bruce2077  时间:2021/5/10 8:57:57  对本文有异议

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

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

Button

构建方法

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

  1. // 1、字符串构建,支持本地化字符串
  2. Button("Hello World") {
  3. // action
  4. }
  5. // 2、自定义样式
  6. Button {
  7. // action
  8. } label: {
  9. VStack(spacing: 8) {
  10. Image(systemName: "square.and.arrow.up")
  11. Text("Share")
  12. }
  13. .padding()
  14. .foregroundColor(.white)
  15. .background(Color.blue)
  16. .cornerRadius(10)
  17. .shadow(color: Color.black.opacity(0.35), radius: 5, x: 0, y: 5)
  18. }

自定义 ButtonStyle

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

  • ButtonStyle :支持自定义样式

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

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

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

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

  1. struct ShadowButtonStyle: ButtonStyle {
  2. func makeBody(configuration: Configuration) -> some View {
  3. configuration.label
  4. .foregroundColor(configuration.isPressed ? .gray : .white)
  5. .padding()
  6. .background(configuration.isPressed ? Color.purple : Color.blue)
  7. .cornerRadius(10)
  8. .shadow(color: Color.black.opacity(0.35), radius: 5, x: 0, y: 5)
  9. }
  10. }
  11. HStack {
  12. Button("Hello") {}
  13. Button("World") {}
  14. }
  15. .buttonStyle(ShadowButtonStyle())

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

  1. struct DoubleTapButtonStyle: PrimitiveButtonStyle {
  2. func makeBody(configuration: Configuration) -> some View {
  3. configuration.label
  4. .gesture(TapGesture(count: 2).onEnded { configuration.trigger() })
  5. }
  6. }
  7. Button("Double Tap") { print("Tapped ") }
  8. .foregroundColor(.white)
  9. .padding()
  10. .background(Color.blue)
  11. .cornerRadius(10)
  12. .buttonStyle(DoubleTapButtonStyle())

EditButton

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

构建方法

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

  1. // 1、字符串构建
  2. Menu("More") {
  3. Button("Add") {}
  4. Button("Edit") {}
  5. Button("Delete") {}
  6. }
  7. // 2、自定义构建
  8. Menu {
  9. Button {} label: {
  10. Label("Add", systemImage: "plus")
  11. }
  12. Button {} label: {
  13. Label("Edit", systemImage: "pencil")
  14. }
  15. Button {} label: {
  16. Label("Delete", systemImage: "minus.circle")
  17. }
  18. // 只要是 View 类型皆可,这里使用了 Picker
  19. Picker("Picker", selection: $selection) {
  20. Text("Item1").tag(0)
  21. Text("Item1").tag(1)
  22. Text("Item1").tag(2)
  23. }
  24. } label: {
  25. Text("More")
  26. Image(systemName: "ellipsis")
  27. }

自定义 MenuStyle

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

  1. struct BorderMenuStyle: MenuStyle {
  2. func makeBody(configuration: Configuration) -> some View {
  3. Menu(configuration)
  4. .foregroundColor(.blue)
  5. .padding(3)
  6. .border(Color.blue, width: 2)
  7. }
  8. }
  9. // 使用
  10. Menu("BorderMenuStyle") {
  11. Button("Add") {}
  12. Button("Edit") {}
  13. Button("Delete") {}
  14. }
  15. .menuStyle(BorderMenuStyle())


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

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

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

原文链接:http://www.cnblogs.com/bruce2077/p/14748015.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号