SwiftUI中Menu和ControlGroup的使用

本篇文章主要介绍一下Menu组件和ControlGroup组件的使用。Menu组件是在iOS 14(tvOS 17)推出的一个组件,点击后提供一个可选择的操作列表。ControlGroup组件是一个容器视图,以视觉上适当的方式为给定的上下文显示语义相关的控件,这意味着ControlGroup的外观将取决于视图的上下文。

Menu的使用

Menu组件提供了一个可选择的操作列表。比较常用的初始化方法如下:

init(@ViewBuilder content: () -> Content,@ViewBuilder label: () -> Label
)

label:该闭包提供一个Menu自身显示的视图内容。
content:该闭包提供点击Menu组件后要显示的视图内容。

下面先看一个使用示例:
在这里插入图片描述

var body: some View {Menu("Tap me") {// Menu 1Text("Menu 1").onTapGesture {print("Menu 1 clicked")}// Menu 2Button("Menu 2") {print("Menu 2 clicked")}// Menu 3Button(action: {print("Menu 3 clicked")}, label: {Label("Menu 3", systemImage: "heart.fill")})// Menu 4Button(action: {print("Menu 4 clicked")}, label: {Text("Menu 4").font(.largeTitle).foregroundColor(.red)Image(systemName: "trash")Image(systemName: "magnifyingglass")})// Menu 5Menu("Copy") {Button("Copy", action: {})Button("Copy Formatted", action: {})Button("Copy Library Path", action: {})}}
}

上面代码中,我们创建了一个menu,传入了一个title,并在content闭包内添加了一些组件。Menu的初始化方法很多,这里不过多的介绍了,我们主要看一下content闭包的内容。

content闭包内:

  • menu1是一个Text组件,并且添加了tap手势,不过事实证明,它只会显示出来,并且文字暗灰色,无法点击,应该是被系统disabled了,所以menu1这种无效。
  • menu2是一个Button组件,仅仅设置了一个title和点击事件。title显示正常,点击事件正常。
  • menu3是一个Button组件,不过其显示内容通过Label组件设置了,并带了一个图片。titleimage显示都正常,点击事件也正常。
  • menu4是一个Button组件,显示内容没有采用Label组件,而是Text加上Image组合,事实证明,TextImage都显示正常,多余的Image无法显示,点击事件正常。
  • menu5是一个Menu组件,这属于嵌套了,一切显示都正常。

之前有一篇文章里面也提及到了MenuPicker的配合使用,感兴趣的朋友可以去看看。SwiftUI中普通Picker的用法

Menu也可以放到导航栏上面,弹出的内容不会超出屏幕。

  var body: some View {NavigationStack {VStack {Color.orange.ignoresSafeArea()}.toolbar(content: {ToolbarItem(placement: .topBarTrailing) {Menu("Copy") {Button("Copy", action: {})Button("Copy Formatted", action: {})Button("Copy Library Path", action: {})}}})}}

ControlGroup的使用

ControlGroup视图是一个简单的容器视图,它接受ViewBuilder闭包,并根据当前环境显示它。ControlGroup视图是iOS 14(tvOS 17)推出的一个组件。
让我们看看如何使用它。

ControlGroup {Button(action: {}) {Label("Decrease", systemImage: "minus")}Button(action: {}) {Label("Increase", systemImage: "plus")}
}

在这里插入图片描述
正如在上面的例子中看到的,我们只是在ControlGroup视图中放了两个按钮,就像我们在VStackHStack中做的那样。但是ControlGroup不是使用垂直或水平轴来布局视图,而是根据视图的上下文添加合适的样式。

样式设置

通过controlGroupStyle修饰符可以添加一些样式,一些主要的样式有:

  • AutomaticControlGroupStyle:可简写为.automatic
  • NavigationControlGroupStyle:可简写为.navigation

具体显示成什么样还得看用在哪里了,比如下面的Demo:
可简写为
上面的代码中,先在界面中间显示了两个,然后在导航栏上加了两个,具体见代码。

自定义样式

我们可以创建一个符合ControlGroupStyle协议的类型,并实现一个名为makeBody的必需函数。

下面代码创建了一个竖向排列的样式:

struct VerticalControlGroupStyle: ControlGroupStyle {func makeBody(configuration: Configuration) -> some View {VStack {configuration.content}.foregroundColor(.red)}
}

在这里插入图片描述

下面这个在ControlGroup组件中添加了一个Title:

struct ControlGroupWithTitle: ControlGroupStyle {let title: LocalizedStringKeyfunc makeBody(configuration: Configuration) -> some View {VStack {Text(title).font(.title)HStack {configuration.content}}}
}

在这里插入图片描述

Menu和ControlGroup的混合使用

MenuControlGroup也是可以放在一起使用的。

下面代码中将ControlGroup放在Menu中使用,具体看看效果吧。

struct MenuAndControlGroupDemo: View {var body: some View {VStack {Menu("Action 1") {Button("Menu 1", action: {})Button("Menu 2", action: {})ControlGroup {Button(action: {}) {Label("Decrease", systemImage: "minus")}Button(action: {}) {Label("Increase", systemImage: "plus")}}}Spacer().frame(height: 60)Menu("Action 2") {Button("Menu 1", action: {})Button("Menu 2", action: {})ControlGroup {Button(action: {}) {Text("Decrease")}Button(action: {}) {Text("Increase")}}}}.padding()}
}

在这里插入图片描述
下面将Menu放到ControlGroup中试试:

  var body: some View {VStack {ControlGroup {Button(action: {}) {Text("Decrease")}Button(action: {}) {Text("Increase")}Menu("Action 1") {Button("Menu 1", action: {})Button("Menu 2", action: {})}}.controlGroupStyle(.navigation)}.padding()}

在这里插入图片描述
这里需要设置.controlGroupStyle(.navigation)才能点击。

如果将整个组合组件放到导航栏里面,那么不设置.controlGroupStyle(.navigation),也是可以点击的。

  var body: some View {NavigationStack {VStack {Color.orange.ignoresSafeArea()}.toolbar(content: {ToolbarItem(placement: .topBarTrailing) {ControlGroup {Button(action: {}) {Text("Decrease")}Button(action: {}) {Text("Increase")}Menu("Action 1") {Button("Menu 1", action: {})Button("Menu 2", action: {})}}}})}}

在这里插入图片描述

写在最后

本文主要介绍了MenuControlGroup的基本使用,都是一些小组件,而且在显示的时候系统也会根据不同平台的上下文语义来决定怎么显示,非常好用,如果用在自己的App中,是不是会增加用户体验呢?

最后,希望能够帮助到有需要的朋友,如果觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/23202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试干货】SQL语言分类

【面试干货】SQL语言分类 1、数据查询语言(DQL)2、数据操纵语言(DML)3、数据定义语言(DDL)4、数据控制语言(DCL)5、结语 💖The Begin💖点点关注,收…

使用gradio库实现Web应用,允许用户上传图像,并使用YOLOv8模型对图像进行目标检测。

一、Gradio Gradio 详细介绍 Gradio 是一个用于构建和分享机器学习模型和数据科学应用的开源Python库。它简化了创建交互式Web界面的过程,让开发者可以快速搭建原型并与他人分享。 主要特性 易用性: 无需前端开发经验:只需几行Python代码就…

服务器端口聚合

服务器网口的band模式主要涉及到网卡绑定(bonding)技术,该技术将两个或更多的物理网卡绑定成一个虚拟网卡,从而实现本地网卡的冗余、带宽扩容和负载均衡。在服务器网络配置中,这种技术有助于提高网络连接的稳定性和性能…

论工业交换机的工业级芯片的重要性

工业交换机作为工业网络中的重要设备,其性能和稳定性对整个工业生产过程至关重要。而工业级芯片作为工业交换机的核心组成部分,更是承载着重要的功能和责任。工业级芯片具有承受恶劣环境的能力,能够在高温、高压、强电磁干扰等恶劣条件下稳定…

html+CSS+js部分基础运用15

1、完成输入框内容的实时反向输出。 2、银行账户余额变动自动通知项目。 设计要求:单击按钮后,余额按照输入框的数额减少,同时将按钮式的提示信息(金额)同步改变。利用侦听属性实现余额发生变化时发出提示信息&#x…

Django render()函数页面渲染

1, render() 函数 在Django框架中,render() 函数是一个非常有用的快捷方式,用于从视图函数返回一个完整的HTTP响应。它负责将给定的模板与上下文数据结合,渲染出最终的HTML页面,并返回一个HttpResponse对象。 from d…

全能大模型AIGC产品的使用体验、选择倾向与未来展望

随着人工智能技术的迅猛发展,AIGC(人工智能生成内容)领域正迎来前所未有的繁荣。其中,全能大模型产品以其强大的生成能力和广泛的应用场景,吸引了众多用户的关注。腾讯元宝APP的上线更是为这一领域注入了新的活力。本文…

第10周 企业认证、分布式事务,分布式锁方案落地

第10周 企业认证、分布式事务,分布式锁方案落地 1. 基于Redis提高请求响应**********************************************************************************************本周我们将对企业入驻认证的流程进行落地,并且结合分布式缓存中间件Redis与Redisson进行相关的技术…

企业(园区)智慧能源双碳平台解决方案

园区作为工业企业集聚区,在提供了大量基础设施和公共服务的同时也成为了碳排放的主要源头。工业园区的耗能约占全社会总耗能的69%,碳排放占全国总排放约31%。工业园区节能、减耗、提质、减碳工作的落实,是我国实现碳达峰碳中和目标的必然要求…

【POSIX】使用iconv库将UTF-8字符串转换为UTF-16字符串

使用<iconv.h>来进行字符串编码的转换 #include <iconv.h> #include <iostream> #include <string.h> #include <unistd.h> #include <memory> #include <fcntl.h>// 需要链接iconv库// iconv -l 命令可列出所有支持的格式 // exam…

python之排序函数np.argsort()函数介绍

np.argsort()是NumPy库中的一个函数&#xff0c;用于返回数组中元素排序后的索引值数组。它根据数组的值从小到大进行排序&#xff0c;并返回相应的索引数组。 1. 基本语法 下面是np.argsort()的语法&#xff1a; numpy.argsort(a, axis-1, kindNone, orderNone) 参…

【python】ModuleNotFoundError: No module named ‘timm’

成功解决“ModuleNotFoundError: No module named ‘timm’”错误的全面指南 一、引言 在Python编程中&#xff0c;经常会遇到各种导入模块的错误&#xff0c;其中“ModuleNotFoundError: No module named ‘timm’”就是一个典型的例子。这个错误意味着你的Python环境中没有安…

springboot项目Redis统计在线用户

springboot项目Redis统计在线用户 我的项目有个显示用户的遗忘曲线&#xff0c;需要统计在线用户以计算他们的曲线 思考了两种方案&#xff0c;但都是用Redis的bitmap数据结构Bitmap是一种特殊类型的数组&#xff0c;其中每个元素只能存储0或1。在Redis中&#xff0c;Bitmap实际…

Python程序判断变量名是否符合标识符的定义

在 Python 中&#xff0c;标识符&#xff08;如变量名、函数名等&#xff09;必须遵循一些规则。这些规则包括&#xff1a; 标识符的第一个字符必须是字母&#xff08;a-z 或 A-Z&#xff09;或下划线&#xff08;_&#xff09;。标识符的其余部分可以由字母、数字或下划线组成…

UML的用例图

UML用例图 用例图示例 假设我们要描述一个图书馆管理系统的UML用例图。 参与者&#xff1a; Librarian&#xff08;图书管理员&#xff09;Member&#xff08;会员&#xff09;Guest&#xff08;访客&#xff09; 用例&#xff1a; Borrow Book&#xff08;借书&#xff09;R…

Web安全:Web体系架构存在的安全问题和解决方案

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

【毕业设计之微信小程序系列】基于微信小程序的餐厅点餐小程序的设计与实现

《基于微信小程序的餐厅点餐小程序的设计与实现》 项目效果图 目录大纲 摘要 1、选题及其意义 1.1、设计项目的名称 1.2、研究意义 2、需求分析 2.1、用户需求分析 2.2、功能需求分析 2.3、非功能需求分析 3、系统相关技术概述 3.1、餐饮平台开发相关技术 3.1.1、微信小程序 …

【BP时序预测】基于鱼鹰算法OOA优化BP神经网络实现温度数据预测算法研究附matlab代码

以下是一个大致的步骤和MATLAB代码框架&#xff1a; 数据准备&#xff1a;准备用于训练和测试的温度数据集。 初始化BP神经网络&#xff1a;定义神经网络的结构&#xff08;如隐藏层的数量和每层的神经元数量&#xff09;。 定义适应度函数&#xff1a;这是优化算法的目标函数…

读AI未来进行式笔记04数字医疗与机器人

1. 数字医疗 1.1. 20世纪的“现代医学”得益于史无前例的科学突破&#xff0c;使得医疗的方方面面都得到改善&#xff0c;让人类预期寿命从1900年的31岁提高到2017年的72岁 1.2. 现有的医疗数据库和流程将实现数字化 1.2.1. 患者记录 1.2.…

实时语音交互数字人解决方案,满足不同场景需求

北京美摄网络科技有限公司凭借其领先的实时语音交互数字人解决方案&#xff0c;为企业带来了全新的沟通体验与商业机遇。 一、技术革新&#xff0c;开启交互新篇章 美摄科技实时语音交互数字人解决方案&#xff0c;以先进的人工智能和机器学习技术为基础&#xff0c;实现了文…