经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
IOS小组件(7):小组件点击交互
来源:cnblogs  作者:popfisher  时间:2021/6/7 13:33:36  对本文有异议

引言

前面我们似乎掌握了实现一个小组件所需要的一切技能,默认情况下桌面点击小组件,也正常跳转到了App中。接下来我们一起来看看,小组件是怎么做到点击跳转到App的。

点击交互方式

点击Widget窗口唤起APP进行交互指定跳转支持两种方式:

  • widgetURL:点击区域是Widget的所有区域,适合元素、逻辑简单的小部件
  • Link:通过Link修饰,允许让界面上不同元素产生点击响应

Widget支持三种显示方式,分别是systemSmall、 systemMedium、systemLarge,其中:

  • systemSmall只能用widgetURL修饰符实现URL传递接收
  • systemMedium、systemLarge可以用Link或者 widgetUrl处理

widgetURL和Link使用特点

  • widgetURL一个布局中只有一个生效
  • Link一个布局中可以有多个
  • Link可以嵌套widgetURL, widgetURL可以签到Link
  • Link可以嵌套Link

点击交互代码测试

如果是使用SwifitUI的工程,监听小组件点击代码如下

  1. @main
  2. struct Training1App: App {
  3.     var body: some Scene {
  4.         WindowGroup {
  5.             ContentView().onOpenURL(perform: { url in
  6.                 print("点击了小组件 absoluteString:\(url.absoluteString)")
  7.                 print("点击了小组件 relativeString:\(url.relativeString)")
  8.             })
  9.         }
  10.     }
  11. }

小号组件点击交互

  1.  VStack {
  2.     Spacer()
  3.     Link(destination: URL(string: "small/link")!) {
  4.         Text("普通文本")
  5.             .font(.system(size: 15))    // 字体
  6.             .foregroundColor(Color(hexString: "#FF0000"))
  7.     }
  8.     Spacer()
  9.     Text(entry.date, style: .timer)
  10.         .multilineTextAlignment(.center)
  11.         .background(Color(hexString: "#FFFF00"))
  12.         .widgetURL(URL(string: "small/widgeturl_text")!)
  13.     Spacer()
  14. }
  15. .frame(maxWidth: .infinity, maxHeight: .infinity)
  16. .background(Color(hexString: "#00FFFF"))
  17. .widgetURL(URL(string: "small/wigeturl_root"))

结果如下:不管点哪个View都只出现了一个,而且根布局的失效了,Link就不起作用,所以小号组件只能使用widgetURL的方式。

小号组件常用点击交互方式

  1. VStack {
  2.     Spacer()
  3.     Text("普通文本")
  4.         .font(.system(size: 15))    // 字体
  5.         .foregroundColor(Color(hexString: "#FF0000"))
  6.     Spacer()
  7.     Text(entry.date, style: .timer)
  8.         .multilineTextAlignment(.center)
  9.         .background(Color(hexString: "#FFFF00"))
  10.     Spacer()
  11. }
  12. .frame(maxWidth: .infinity, maxHeight: .infinity)
  13. .background(Color(hexString: "#00FFFF"))
  14. .widgetURL(URL(string: "small/wigeturl_root"))

结果:widgetURL生效

中号组件点击交互1

  1. VStack {
  2.     Link(destination: URL(string: "medium/link_text1")!) {
  3.         Text("普通文本")
  4.             .font(.system(size: 15))    // 字体
  5.             .foregroundColor(Color(hexString: "#FF0000"))
  6.     }
  7.     Link(destination: URL(string: "medium/link_text2")!) {
  8.         Text(entry.date, style: .timer)
  9.             .multilineTextAlignment(.center)
  10.             .background(Color(hexString: "#FFFF00"))
  11.     }
  12.     Text("普通文本2")
  13.         .font(.system(size: 15))    // 字体
  14.         .foregroundColor(Color(hexString: "#FF0000"))
  15.         .widgetURL(URL(string: "medium/widgeturl_text"))
  16. }
  17. .frame(maxWidth: .infinity, maxHeight: .infinity)
  18. .background(Color(hexString: "#00FFFF"))
  19. .widgetURL(URL(string: "medium/widgeturl_root"))

分别点击三个子View和根布局(空白处)结果:widgetURL只有一个生效,Link都生效

中号组件点击交互2

  1. VStack {
  2.     Link(destination: URL(string: "medium/link_text1")!) {
  3.         Text("普通文本")
  4.             .font(.system(size: 15))    // 字体
  5.             .foregroundColor(Color(hexString: "#FF0000"))
  6.     }
  7.     Link(destination: URL(string: "medium/link_text2")!) {
  8.         Text(entry.date, style: .timer)
  9.             .multilineTextAlignment(.center)
  10.             .background(Color(hexString: "#FFFF00"))
  11.     }
  12.     Text("普通文本2")
  13.         .font(.system(size: 15))    // 字体
  14.         .foregroundColor(Color(hexString: "#FF0000"))
  15. }
  16. .frame(maxWidth: .infinity, maxHeight: .infinity)
  17. .background(Color(hexString: "#00FFFF"))
  18. .widgetURL(URL(string: "medium/widgeturl_root"))

分别点击三个子View和根布局(空白处)结果:多个Link生效,widgerURL嵌套Link生效

中号组件点击交互3

  1. Link(destination: URL(string: "medium/widgeturl_root")!) {
  2.     VStack {
  3.         Link(destination: URL(string: "medium/link_text1")!) {
  4.             Text("普通文本")
  5.                 .font(.system(size: 15))    // 字体
  6.                 .foregroundColor(Color(hexString: "#FF0000"))
  7.         }
  8.         Link(destination: URL(string: "medium/link_text2")!) {
  9.             Text(entry.date, style: .timer)
  10.                 .multilineTextAlignment(.center)
  11.                 .background(Color(hexString: "#FFFF00"))
  12.         }
  13.         Text("普通文本2")
  14.             .font(.system(size: 15))    // 字体
  15.             .foregroundColor(Color(hexString: "#FF0000"))
  16.     }
  17.     .frame(maxWidth: .infinity, maxHeight: .infinity)
  18.     .background(Color(hexString: "#00FFFF"))
  19. }

运行结果:Link嵌套Link生效

结语

本文介绍了小组件点击交互的两种方式,widgetURL和Link,通过测试代码了解了具体的使用和组合情况。至此,小组件整个流程上的技术点都讲解完了。后续还有2个部分:App与小组件数据共享,N个小组件怎么支持。

原文链接:http://www.cnblogs.com/popfisher/p/14858349.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号