首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SwiftUI:有没有办法在点击时只折叠一个按钮,而不是所有按钮

SwiftUI是一种用于构建iOS、macOS、watchOS和tvOS应用程序的用户界面工具包。它提供了一种声明性的方式来构建用户界面,使开发人员能够以简洁、直观的方式创建交互式应用程序。

在SwiftUI中,可以使用Toggle控件来实现按钮的折叠和展开功能。Toggle是一种开关控件,可以在打开和关闭之间切换。通过将每个按钮与一个Toggle关联起来,可以实现在点击时只折叠一个按钮的效果。

以下是一个示例代码,演示了如何使用Toggle来实现按钮的折叠和展开:

代码语言:txt
复制
import SwiftUI

struct ContentView: View {
    @State private var isButtonCollapsed = false
    
    var body: some View {
        VStack {
            Button(action: {
                self.isButtonCollapsed.toggle()
            }) {
                Text("按钮")
                    .font(.title)
                    .foregroundColor(.white)
                    .padding()
                    .background(Color.blue)
                    .cornerRadius(10)
            }
            .padding()
            
            if !isButtonCollapsed {
                Button(action: {
                    // 按钮的点击事件
                }) {
                    Text("折叠的按钮")
                        .font(.title)
                        .foregroundColor(.white)
                        .padding()
                        .background(Color.blue)
                        .cornerRadius(10)
                }
                .padding()
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

在上述代码中,使用了一个名为isButtonCollapsed的布尔型状态变量来表示按钮的折叠状态。当点击第一个按钮时,通过调用self.isButtonCollapsed.toggle()来切换isButtonCollapsed的值,从而实现按钮的折叠和展开。

body属性中,使用了if语句来根据isButtonCollapsed的值来决定是否显示折叠的按钮。只有当isButtonCollapsedfalse时,才会显示折叠的按钮。

这样,当点击第一个按钮时,只有折叠的按钮会被隐藏或显示,而其他按钮保持不变。

推荐的腾讯云相关产品:腾讯云移动开发平台(https://cloud.tencent.com/product/mmp)

请注意,以上答案仅供参考,具体实现方式可能因个人需求和项目要求而有所不同。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Ask Apple 2022 与 SwiftUI 有关的问答(上)

假设我们想创建一个类似于 iMessage 的视图,在那里你可以看到一个信息列表(与本例无关),视图的底部有一个文本框。当用户点击文本字段,键盘会在其工具栏中出现一个文本字段。...我的例子中,不拖动从 0 到 75,拖动从 0 到 100。有什么办法可以阻止这种情况吗?A:你可以用 .chartYScale(domain: 0 ... 75) 锁定 Y 轴的刻度域。...我是 SwiftUI 新手。我的问题是关于场景的。几乎所有教程和示例代码库中,使用了一个 WindowGroup 场景,所有内容都嵌套在 ContentView 中。...最近,我注意到 SwiftUI 视图的 onAppear 在意想不到的时间启动,比如当 UITabBarController 被创建不是当视图本身出现时。...在有些情况下,我想根据视图是否折叠来做决定( 例如,如果展开,详细视图中显示一条信息,如果折叠,则显示一个警告或其他指示 )。

12.2K20

SwiftUI @State @Published @ObservedObject 深入理解和使用

@State 介绍 因为SwiftUI View 采用的是结构体,当创建想要更改属性的结构体方法,我们需要添加mutating关键字,例如: mutating func doSomeWork() 然而...但是相信我,这是值得的:随着你的进步,你会了解到SwiftUI经常破坏和重新创建你的结构体,所以保持它们的小简单的结构对性能很重要。...提示:SwiftUI中存储程序状态有几种方法,您将学习所有这些方法。@State是专门为存储一个视图中的简单属性而设计的。...= 1 }, label: { Text("更新数据") }) } } } 不出意外上面代码点击按钮就会更新数据...字段)没更新,就不会更新View /// 最简单的解决办法就是 更新直接继承 ObservableObject(父对象) 里面的随便一个属性

2.9K10

解析 SwiftUI 中两处由状态更新滞后引发的严重 Bug

众所周知,SwiftUI一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示,应直接对状态进行修改。...通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死这是一个 SwiftUI 所有版本中存在的错误,你可以众多的论坛或聊天室里看到不少的开发者都在寻找解决方法。...它的复现条件非常简单:真机上测试( 模拟器上不容易复现 )点击 “GO” 按钮进入下一层视图点击 “Show Sheet” 按钮弹出 Sheet通过下滑手势取消 Sheet Sheet 取消后(动画结束...然而,明显地,强迫用户点击 “Dismiss” 按钮不是一个好的选择,特别是没有屏蔽手势取消 Sheet 的情况下。...请至少进入第三级视图滚动当前视图当视图处于滚动状态点击 NavigationStack 左上角的 “Back” 按钮

579110

解析 SwiftUI 中两处由状态更新滞后引发的严重 Bug

众所周知,SwiftUI一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示,应直接对状态进行修改。...通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死 这是一个 SwiftUI 所有版本中存在的错误,你可以众多的论坛或聊天室里看到不少的开发者都在寻找解决方法。...它的复现条件非常简单: 真机上测试( 模拟器上不容易复现 ) 点击 “GO” 按钮进入下一层视图 点击 “Show Sheet” 按钮弹出 Sheet 通过下滑手势取消 Sheet Sheet 取消后...然而,明显地,强迫用户点击 “Dismiss” 按钮不是一个好的选择,特别是没有屏蔽手势取消 Sheet 的情况下。...请至少进入第三级视图 滚动当前视图 当视图处于滚动状态点击 NavigationStack 左上角的 “Back” 按钮

26120

如何结合 Core Data 和 SwiftUI

core data stack SwiftUI 和 Core Data 之间相差将近十年 —— SwiftUI 随着 iOS 13 面世 Core Data 则是 iPhoneOS 3 的产物;...为了进行试用,请点击 “Add Entity” 按钮创建一个新实体,然后双击其名称将其重命名为 “Student”。...如果我们对 Core Data 说“这不是必须的”(您可以模型编辑器中完成),它仍然会生成可选的 Swift 属性,因为所有 Core Data 关心的是属性保存具有值——在其他时间它们可以为 nil...为了解决这个问题,我们将在列表下方创建一个按钮,每次点击都会添加一个新的随机学生,但是首先我们需要一个新属性来存储托管对象上下文。 让我重申一下,因为这很重要。...我们无法代码中看到该类,因为它是构建项目自动生成的,就像 Core ML 的模型一样。

11.8K30

TCA - SwiftUI 的救星?(一)

自那时过了两年后, SwiftUI 的发布才让这套机制有了更加合适的舞台。 SwiftUI 发布初期,我也写过一本相关的书籍[3],里面使用了一些类似的想法,但是很不完善。...另外,当我们有更多更复杂的 Reducer ,我们也可以选择某个或某几个 Reducer 上调用 .debug() 来帮助调试。...初始化 Counter 提供 initialState ,我们传递了一个随机值。...为数据文本添加颜色 为了更好地看清数字的正负,请为数字加上颜色[13]:正数用绿色显示,负数用红色显示。 添加一个 Reset 按钮 除了加和减以外,添加一个重置按钮,按下后将数字复原为 0。...为 Counter 补全所有测试 现在测试中包含了 .increment 的情况。请添加减号和重置按钮的相关测试。

3.2K30

AVKit框架详细解析(四) —— 基于AVKit 和 AVFoundation框架的视频流App的构建

您的目标是在用户点击其中一个单元格显示视频播放器。 1. Adding Local Playback 您可以播放两种类型的视频。 您将看到的第一个是当前位于手机存储中的类型。...您的下一个任务是将黑框变成自定义视频播放器。 它的目的是播放一组循环剪辑,让用户对所有这些视频感到兴奋。 然后,您需要添加一些自定义手势,例如点击打开声音和双击将其更改为 2 倍速度。...作为一个体贴的应用程序开发人员,您应该允许用户关闭他们自己的音乐,不是大胆地假设您的应用程序应该胜过所有其他应用程序。...AVAudioSession.sharedInstance().setCategory(.playback) } 初始化程序中,确保调用此方法不是旧方法: init() { setVideoPlaybackCategory...您会在左上角看到画中画按钮……否则不会! 缺点是,撰写本文,iOS 14.5是可用的最新版本,VideoPlayer 的 SwiftUI 视图未显示画中画按钮

6.9K10

js那些事

如果代码被折叠有没有一个代码地图文件,那么对行号的渲染是不是根本就是没有什么用了呢? 我想对这些问题的回答相当简单,答案就是:想这些会让你一整天都会过的相当糟心。 可读性 咦,我听说你还不信。...这避免了评估代码出现心理障碍。 这也有助于分清楚其中的关系。与创建一个方法、将其传递、然后运行逻辑不同,第二个例子中的参数被给到了then,catch只是指向了发生所有事情的函数。...没错,既然想知道点击是否成功,我们当然是代码中的点击事件处添加一个断点,切记不要添加在226行哦,因为被执行的是click方法内的函数,不是226行的选择器。断点现在已经打上了,然后做什么呢?...假设上图我227行打了个断点,然后一直点击逐语句执行”按钮到229行,这时候如果再点击一次“逐语句执行”按钮呢?则会进入下图的js里: ?...实际情况下,我们应该养成拿到问题的第一间,自行在脑海中排查问题,找到最有可能出现问题的点,如果没办法迅速的排查出最重要的点,那么你可以使用最麻烦但是很靠谱的方法,利用“逐语句执行”按钮将整个和问题相关的

1.3K30

Xcode 11 初体验

使用 Focus Mode 专注使用某一个窗口。 综合这个功能还是不错的,我经常也会打开多个页面!来回进去出来麻烦! 直接点击这个按钮,会横向进行分割。...当你的项目关联了版本控制工具,比如 Git, Xcode 会检测出当前文件哪些地方相对于上次递交的版本有更改,并且会通过左边显示一个蓝色线条标记出来: Change Bar 点击左键还可以选择 show...开发和调试,随时暗黑和明亮模式之间进行切换。 Asset目录可以使你轻松的控制图像和颜色暗黑和明亮模式之间进行切换。...Stash Changes 选择 Stash Changes 选项,会自动弹出一个对话框,提示我们输入一些Comment 信息。点击Stash 按钮自动跳转到Git管理Tab 下。... Stash 右下角会有 Stash 功能选择按钮(也可以左侧Stash Changes右键弹出)。

3.1K10

面向所有人的 UI 编程 :透过点按弹窗初尝 SwiftUI

SwiftUI 集众家之长,具有诸多优秀特性,可以预见它将会出现在诸多应用程序中。若你有兴趣,我会在其它文章中详解 SwiftUI,本文着重讲其中弹窗的写法与逻辑。 你会怎样描述一个程序?...本文我将用如下图中的一个例子来展示如何设置点按弹窗。下图中程序的功能很简单:长按这句名言后,会出现点按弹窗,你可以点击复制按钮将这句话复制到系统剪贴板中。 ? 试想你是一名美术,完全不了解程序。...纵向排列的 View SwiftUI 里叫做 VStack,它用一个花括号 {包住里面的内容};文字的 View SwiftUI 里叫做 Text。...点按菜单,顾名思义,就是一个按钮,那么我们设置一个 Button View。...若你因为文中的长代码感到害怕,觉得程序员都是天才,脑子超好用能将这些代码一次性全写出来,不是这样的。比如上面代码中的例子,一开始你只有一个简单的思路,我要一句名言,能点按复制就行。

2.1K40

避免 SwiftUI 视图的重复计算

所有可以让变量成为 Source of Truth 的属性包装器都有一个特点 —— 符合 DynamicProperty 协议。...点击 random age 按钮修改 age 属性后,尽管 StudentNameView 中并没有使用 age 属性,但 SwiftUI 仍然对 StudentNameView 和 StudentAgeView...func sendID(_ id: Int) { self.selection = id } } 当点击一个 CellView 视图的按钮后,所有的 CellView ( 当前...图片 这是因为,乍看起来,我们并没有 CellView 中引入会导致更新的 Source of Truth,但由于我们将 store 放置闭包当中,点击按钮后,因为 store 发生了变动,从而导致...因此,为了减少因事件源导致的重复计算,我们可以考虑采用如下的优化思路: 控制生命周期 需要处理事件才加载与其关联的视图,用关联视图的存续期来控制触发器的生命周期 减小影响范围 为触发器创建单独的视图

9.2K81

为什么 SwiftUI 的修饰符顺序很重要

每当我们将修饰符应用于 SwiftUI 视图,我们实际上都会创建一个,应用了更改的新视图 —— 我们不仅仅是修改现有的视图。...相反,您会看到一个 200x200 的空正方形,中间是 “Hello World”, “Hello World” 周围有一个红色矩形。...如果思考一下修饰符的工作原理,您就可以了解为什么会如此:每个修饰符都会创建一个,应用了该修饰符的新结构体,不是视图上设置属性。 您可以通过查询视图主体的类型来窥视 SwiftUI 的底层。...如您所见,我们使用 ModifiedContent 类型堆叠——每个视图都需要一个视图进行转换以及要进行的实际更改,不是直接修改视图。 这意味着修饰符的顺序很重要。...当然,这不是 SwiftUI 实际上的工作方式,因为如果这样做,那将是性能上的噩梦,但这是学习的时候可以使用的一种简洁的思维捷径。

2.3K20

架构之路 (五) —— VIPER架构模式(一)

人们普遍认为所有的应用逻辑都应该进入SwiftUI视图,但事实并非如此。...当将用户操作发送回数据模型,VIPER模式甚至更有用。 为此,您将添加一个按钮来创建一个新的旅程。...点击+按钮将向列表添加一个New Trip。 4. Deleting a Trip 创建旅行的用户可能还希望能够删除它们,以防出错或旅行结束。既然已经创建了数据路径,向屏幕添加额外的操作就很简单了。...当您将其放置NavigationView中,该链接将成为一个按钮,将destination推送到导航堆栈上。 content块可以是任何一个SwiftUI视图。...构建并运行,现在,当用户点击单元格,它将把它们路由到“Hello World”TripDetailView。 3.

17.3K10

5 款超牛逼的 Jupyter Notebook 插件!

1、Scratchpad 这个插件非常有用,我们做数据分析EDA或者特征工程时经常要各种尝试,不是要真正的运行cell代码。...结果是仅显示第一行中的注释,不显示整个单元格。这样,当我们删除代码,可以保留第一行的注释,对单元格进行简短准确的描述。...另一个应用场景是删除所有非Python代码,以避免可能的干扰。 折叠会将上面的单元格变成: 此外,保存Jupyter notebook后,所有折痕都将保存。...4、Table of contents 这个插件将为notebook增加一个目录。 通过点击下方图片中红框内的按钮,即可激活或停用它。...5、Variable Inspector 可以通过菜单上标红的按钮来执行该扩展。 点击按钮后,将显示当下命名空间中的所有变量信息,包括变量的名称、类型、大小、形式和值。

85120

【Python基础】分享5 款超牛逼的 Jupyter Notebook 插件!

1、Scratchpad 这个插件非常有用,我们做数据分析EDA或者特征工程时经常要各种尝试,不是要真正的运行cell代码。...结果是仅显示第一行中的注释,不显示整个单元格。这样,当我们删除代码,可以保留第一行的注释,对单元格进行简短准确的描述。 所以,以下单元格… ? …可以折叠成这样: ?...3、魔术折叠 上面的概念也适用于第一行是魔术命令的情况。 这个特殊的折叠对于import导入包的单元格可能特别有用。 另一个应用场景是删除所有非Python代码,以避免可能的干扰。 ?...通过点击下方图片中红框内的按钮,即可激活或停用它。 ? 当使用含有较多内容的notebook,该功能的实用性便体现出来了。 点击目录中的任何标题,即可直接定位到notebook的相应位置。...5、Variable Inspector 可以通过菜单上标红的按钮来执行该扩展。 点击按钮后,将显示当下命名空间中的所有变量信息,包括变量的名称、类型、大小、形式和值。 ?

1.1K40

SwiftUI数据流之State&Binding

@State检测的是值类型 值类型仅有独立的拥有者,class类型可以多个指向一个;对于两个SwiftUI View而言,即使发送给他们两个相同的struct对象,事实上他们每个View都得到了一份独立的...struct的拷贝,所以其中一个View的struct值发生变化,对另一个没有影响;反之,如果是class则会互相影响; 当User是一个结构体,每次我们修改这个结构体的属性,Swift实际上是创建一个新的结构体实例...@Binding的作用是保存状态的属性和更改数据的视图之间创建双向连接,将当前属性连接到存储在别处的单一数据源(single source of truth),不是直接存储数据。...为了分析变量状态,16行,User结构体init方法;39行,ContentView的init方法结束;47行,按钮点击执行函数部分,都加入了断点 由于@State针对值类型,为了打印出struct的地址...,这里没有全部展示出来; 再点击一次Count+1按钮,count值变为2,user的地址将持续保持不变,生命周期与视图保持一致。

3.9K30

酷我音乐iOS小组件适配开发实践

如果通过点击widget中的动作打开app这个过程我们通俗点叫它拉端 就是点击widget后会产生直接把app调用起来的效果,有些开发者喜欢叫它呼起app.都一个意思,以下简称拉端操作 我们之前都了解...(我们不推荐这样实现,因为这样做可能一个组件只能适配iOS,却不能适配其它 例如watchOS、等系统,就造成兼容性下降等问题.) 2.SwiftUI中支持的Button widget中无法正常使用...小组件里面加一个按钮经常出现边缘太大,样式填充问题(红线是笔者截图加上去的请忽略) 浅蓝色透明度的填充部分,需要设置按钮的显示样式才能去掉,默认就是上图这种方式有填充....经过上述操作后,我们只能给小组件加一个按钮,并不能实现点击按钮触发事件,当我们点击button的时候直接拉端,根本不给我们处理这个按钮点击机会. 这是因为小组件不支持常规按钮....Intent的按钮. 5.widgetURL和Link跳转app问题 当我们点击某些View的时候需要跳转host app,小组件的Extension中有一个apiwidgetURL 先来看一下示例代码

50710

酷我音乐iOS小组件适配开发实践

如果通过点击widget中的动作打开app这个过程我们通俗点叫它拉端 就是点击widget后会产生直接把app调用起来的效果,有些开发者喜欢叫它呼起app.都一个意思,以下简称拉端操作 我们之前都了解...(我们不推荐这样实现,因为这样做可能一个组件只能适配iOS,却不能适配其它 例如watchOS、等系统,就造成兼容性下降等问题.) 2.SwiftUI中支持的Button widget中无法正常使用...小组件里面加一个按钮经常出现边缘太大,样式填充问题(红线是笔者截图加上去的请忽略) 浅蓝色透明度的填充部分,需要设置按钮的显示样式才能去掉,默认就是上图这种方式有填充....经过上述操作后,我们只能给小组件加一个按钮,并不能实现点击按钮触发事件,当我们点击button的时候直接拉端,根本不给我们处理这个按钮点击机会. 这是因为小组件不支持常规按钮....Intent的按钮. 5.widgetURL和Link跳转app问题 当我们点击某些View的时候需要跳转host app,小组件的Extension中有一个apiwidgetURL 先来看一下示例代码

79730

为什么SwiftUI修饰符顺序很重要?

每当我们将修饰符应用于SwiftUI视图,我们实际上都会创建一个应用了更改的新视图——我们不仅会修改现有的视图。...相反,您会看到一个200x200的空正方形,中间是“ Hello World”,“ Hello World”周围有一个红色矩形。...如果思考一下修饰符的工作原理,您就可以了解为什么会如此:每个修饰符都会创建一个应用了该修饰符的新结构体,不是视图上设置属性。 您可以通过查询视图主体的类型来窥视SwiftUI的底层。...如您所见,我们使用ModifiedContent类型堆叠——每个视图都需要一个视图进行转换以及要进行的实际更改,不是直接修改视图。 这意味着修饰符的顺序很重要。...例如,SwiftUI为我们提供了padding()修饰符,该修饰符视图周围添加了一些空间,从而不会将其推到其他视图或屏幕边缘。

2.3K10
领券