首页
学习
活动
专区
工具
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(父对象) 里面的随便一个属性

3K10

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

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

587110

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

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

26520

如何结合 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

5 款超牛逼的 Jupyter Notebook 插件!

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

85220

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

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

1.1K40

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

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

2.3K20

避免 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

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

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

2.1K40

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

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

17.4K10

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的地址将持续保持不变,生命周期与视图保持一致。

4K30

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

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

52910

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

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

81230

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

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

2.3K10
领券