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代码就…

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

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

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%。工业园区节能、减耗、提质、减碳工作的落实,是我国实现碳达峰碳中和目标的必然要求…

【python】ModuleNotFoundError: No module named ‘timm’

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

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

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

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

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

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

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

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

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

批量提取 Word 文档中的全部图片

步骤 1、打开 WinRAR 任选一个现成的压缩包双击打开 WinRAR ,或从开始菜单打开 WinRAR 2、直接把要提取图片的 Word 文档拖入 WinRAR 菜单区域 1 → 2 → 3,WinRAR 资源管理目录中的 media 就是该 Word 文档所要提取的全部图片所在文件夹 按住&#x…

人工智能任务5-高级算法工程师需要学习哪些课程与掌握哪些能力

大家好,我是微学AI,今天给大家介绍一下人工智能的任务5-高级算法工程师需要学习哪些课程,需要掌握哪些能力。高级算法工程师需要掌握的算法模型有:人脸检测模型MTCNN,人脸识别方法Siamese network、center loss、softm…

基于协同注意力的视觉-语言嵌入用于机器人手术视觉问题定位回答

文章目录 CAT-ViL: Co-attention Gated Vision-Language Embedding for Visual Question Localized-Answering in Robotic Surgery摘要方法实验结果 CAT-ViL: Co-attention Gated Vision-Language Embedding for Visual Question Localized-Answering in Robotic Surgery 摘要…

今日份动态规划学习(二维01背包+01背包变形)

目录 P1877 [HAOI2012] 音量调节 P1877 [HAOI2012] 音量调节 题解:一个入门级别的01背包问题,首先就是为什么能看出是01背包,因为只有两种状态,要不增大音量,要不减小音量,和01背包的选与不选非常近似。但…

酱菜产业:传承美味,点亮生活

酱菜,这道深受人们喜爱的传统美食,以其独特的风味和营养价值,点亮了我们的日常生活。酱菜产业作为美食文化的重要组成部分,正以其独特的魅力,吸引着越来越多的消费者。 酱菜产业的赵总说:酱菜的制作过程&am…

C++结合OpenCV进行图像处理与分类

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三…

数据库(24)——外键约束

概念 外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。 具有外键的表称为子表,关联的表称为父表。 语法 添加外键 CREATE TABLE 表名( 字段名 数据类型, .. [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主…