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

从GeometryReader中进行更改时,SwiftUI不会反映对@Binding @State变量所做的更改

在SwiftUI中,GeometryReader是一个用于获取父视图的几何信息的容器视图。当我们在GeometryReader中对@Binding或@State变量进行更改时,SwiftUI不会自动更新视图。

要使SwiftUI能够反映对@Binding或@State变量所做的更改,我们可以使用以下方法之一:

  1. 使用ObservableObject和@Published属性:创建一个ObservableObject类,并在其中使用@Published属性来包装需要观察的变量。然后,在视图中使用@ObservedObject修饰符将ObservableObject实例与视图关联起来。当@Published属性的值发生更改时,SwiftUI会自动更新视图。
  2. 使用onChange修饰符:在视图中使用onChange修饰符,并在其中检测@Binding或@State变量的更改。在onChange闭包中,我们可以手动更新视图或执行其他操作。

下面是一个示例代码,演示了如何使用ObservableObject和@Published属性来实现对GeometryReader中@Binding或@State变量更改的反映:

代码语言:txt
复制
import SwiftUI

class ViewModel: ObservableObject {
    @Published var value: CGFloat = 0.0
}

struct ContentView: View {
    @ObservedObject var viewModel = ViewModel()

    var body: some View {
        VStack {
            GeometryReader { geometry in
                Rectangle()
                    .frame(width: geometry.size.width * self.viewModel.value, height: 100)
                    .foregroundColor(.blue)
            }
            .frame(height: 100)
            
            Slider(value: $viewModel.value, in: 0...1)
                .padding()
        }
    }
}

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

在上面的示例中,我们创建了一个名为ViewModel的ObservableObject类,并在其中使用@Published属性包装了value变量。在ContentView中,我们使用@ObservedObject修饰符将ViewModel实例与视图关联起来。当Slider的值发生更改时,GeometryReader中的Rectangle的宽度将自动更新。

这是一个简单的示例,展示了如何在SwiftUI中实现对GeometryReader中@Binding或@State变量更改的反映。根据具体的应用场景和需求,我们可以使用其他方法来实现相似的效果。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云计算服务:https://cloud.tencent.com/product
  • 腾讯云数据库服务:https://cloud.tencent.com/product/cdb
  • 腾讯云服务器运维服务:https://cloud.tencent.com/product/cvm
  • 腾讯云人工智能服务:https://cloud.tencent.com/product/ai
  • 腾讯云物联网服务:https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发服务:https://cloud.tencent.com/product/mobdev
  • 腾讯云存储服务:https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务:https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙服务:https://cloud.tencent.com/product/mu
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

解析SwiftUI布局细节(二)循环轮播+复杂布局

,都比较简单,可能是就是这个 environmentObject (我把它称为环境变量)这个是需要特别说明一个变量名字上可以看出,这个修饰符是针对全局环境。...有一个还得说明一下,GeometryReader 改变了它显示内容方式。在 iOS 13.5 ,内容放置方式为 .center。在 iOS 14.0 则为:.topLeading。...区别于我们UIKit创建方式,SwiftUI对它进行了简化,具体创建如下: /// SwiftUI对定时器简化,可以进去看看具体参数定义 private let timer = Timer.publish...= .zero /// 当前显示位置索引, /// 这是实际数据1就是数据没有被处理之前0位置图片 /// 所以这里默认1开始 @State var currentIndex...之GeometryReader 理解SwiftUI关键字 State Binding ObservesOgiect EnvironmentObje SwiftUI 自定义实现旋转木马轮播效果

12.1K20
  • 高级 SwiftUI 动画 — Part 2:GeometryEffect

    为了模拟关键帧,我们将定义一个可动画参数,我们将其 0 到 1 改变。当该参数为 0.2 时,我们达到了动画前 20%。当该参数为 0.8 或更大时,我们就进入了动画最后 20%。...我们将创建一个效果,让我们进行三维旋转。虽然SwiftUI已经有了一个修饰符,即.rotrotation3DEffect(),但这个修饰符将是特别的。...每当我们视图旋转到足以向我们展示另一面时,一个布尔绑定将被更新。 通过对绑定变量变化做出反应,我们将能够替换正在旋转动画过程视图。这将创造一种错觉,即视图有两个面。...在SwiftUI,默认锚点是在视图前角,而在Core Animation是在中心。虽然现有的.rotrotingg3DEffect()修饰符可以让你指定一个锚点,但我们正在建立我们自己效果。...我们今天所做三个例子,几乎没有什么共同点,只是它们都使用相同协议来实现其目标。GeometryEffect很简单:它只有一个方法需要实现,然而,它可能性是无穷,我们只需要运用一点想象力。

    1.3K30

    SwiftUI 之 HStack 和 VStack 切换

    GeometryReader GeometryReader 能实现吗?...为了使代码可用性更高,我们不会硬编码让两个堆栈变体使用对齐或间距什么。...使用布局协议 虽然我们最后已经用了非常棒解决方案,可以在所有支持 SwiftUI iOS 版本中使用,但也让我们来探索一下在 iOS 16 引入一些新布局工具(在写这篇文章时,它作为...Xcode 14 一部分仍在测试阶段) 其中一个工具是新 Layout 协议,它既能让我们创建完整自定义布局,直接集成到 SwiftUI 布局系统,同时也提供给我们一种丝滑更动画方式在各种布局之间动态切换...这样做会令动画流畅,例如在切换设备方向时,我们也有可能在执行此类更改时获得小幅性能提升(因为 SwiftUI 总是在其视图层次结构为静态时尽可能表现最佳) 选择合适视图 但我们还没有结束,因为

    2.8K10

    SwiftUI 创建一个环形 Slider

    环形Slider Slider 控件是一种允许用户从一系列值中选择一个值 UI 控件。在 SwiftUI ,它通常呈现为直线上拇指选择器。...有时将这种类型选择器呈现为一个圆圈,拇指绕着圆周移动可能会更好。本文介绍如何在 SwiftUI 定义一个环形 Slider。...有关默认 Slider 更多信息,可以参阅 如何在 SwiftUI 自定义 Slider 自定义外观内容。 初始化环形轮廓 ZStack三个圆环开始。...ringDiameter) Spacer() } .padding(80) } } 初始化环形轮廓 将进度值和拇指位置绑定 将进度变量更改为状态变量并添加默认...视图被提取到一个单独结构,该结构具有圆形滑块上进度一个绑定值。 滑块range可选参数也是可用。这需要对进度进行一些调整,以计算已设置角度以及拇指在圆形滑块上位置旋转角度。

    3.6K30

    SwiftU:将状态绑定到UI控件

    SwiftUI@State属性包装器允许我们自由修改视图结构体,这意味着当程序更改时,我们可以更新视图属性以匹配。 但是,使用UI控件时,事情会复杂一些。...但是,该代码不会编译,因为SwiftUI想知道文本字段文本存储位置。 请记住,视图是其状态函数——文本输入框只能在反映存储在程序值时显示某些内容。...SwiftUI需要是结构一个字符串属性,它可以显示在文本输入框,还将存储用户在文本输入框中键入任何内容。...这告诉Swift,它应该读取属性值,但也应该在发生任何更改时将其写回。...因此,当您在属性名称前看到一个美元符号时,请记住它创建了一个双向绑定:属性值是读,也是写Binding state to user interface controls

    2.9K10

    深入了解 SwiftUI 5 ScrollView 新功能

    SwiftUI 5.0 ,苹果大幅强化了 ScrollView 功能。新增了大量新颖、完善 API。本文将对这些新功能进行介绍,希望能够让它们更多、更早帮助到有需要开发者。...使用 scrollIndicatorsFlash(trigger:) 可以在提供更改时,修饰符作用域范围内所有可滚动容器滚动指示器短暂闪烁。...任何超出边界部分将不会显示。 当 scrollClipDisable 为 true 时,滚动内容不会被裁剪。它可以延伸超出滚动容器边界,从而显示更多内容。...它只影响滚动视图初始状态,一次性设置。通常用于实现类似初始状态底部显示 IM 应用、 trailing 开始显示数据等情况。通过 UnitPoint 可以同时设置两个轴向初始位置。...总结 我完全没有想到,在 SwiftUI 5 ,苹果对 ScrollView 进行了全面增强。值得赞赏是,他们不仅提供了一些一直期待功能,而且在 API 设计和实现完成度上都非常出色。

    83220

    SwiftUI 方式进行布局

    offset 则是在渲染层面进行位置调整,即使出现了位置变化,其他视图在布局时,并不会将其位移考虑在其中。...在上面的代码,由于两个视图使用了同样动画曲线设定,因此,在移动时并不会出现分离情况。...有关建议尺寸、需求尺寸等内容,请参阅 SwiftUI 布局 —— 尺寸( 上 )[5] 一文 三、NameSpace 3.0 版本( iOS 15 )开始,SwiftUI 提供了新 NameSpace...SwiftUI进行布局时,当布局容器给出建议尺寸无法满足全部子视图需求尺寸时,会根据子视图 Priority,优先满足级别较高视图布局需求。...视图二同理 六、再战 AlignmentGuide 在上面使用 AlignmentGuide 例子,我们通过 GeometryReader 获取了视图二高度信息,并通过设置显式对齐指南来完成了移动

    3.3K00

    SwiftUI 方式进行布局

    offset 则是在渲染层面进行位置调整,即使出现了位置变化,其他视图在布局时,并不会将其位移考虑在其中。...在上面的代码,由于两个视图使用了同样动画曲线设定,因此,在移动时并不会出现分离情况。...有关建议尺寸、需求尺寸等内容,请参阅 SwiftUI 布局 —— 尺寸( 上 ) 一文 三、NameSpace 3.0 版本( iOS 15 )开始,SwiftUI 提供了新 NameSpace...SwiftUI进行布局时,当布局容器给出建议尺寸无法满足全部子视图需求尺寸时,会根据子视图 Priority,优先满足级别较高视图布局需求。...视图二同理 六、再战 AlignmentGuide 在上面使用 AlignmentGuide 例子,我们通过 GeometryReader 获取了视图二高度信息,并通过设置显式对齐指南来完成了移动

    4.8K80

    了解 SwiftUI onChange

    了解 SwiftUI onChange 请访问我博客 www.fatbobman.com[1] 获得更好阅读体验 iOS 14 开始,SwiftUI 为视图提供了 onChange 修饰器,...通过使用 onChange,我们可以在视图中对特定进行观察,并在其更改时触发操作。...在闭包可以进行副作用操作,或者修改视图中其他可变内容。 传递到闭包值(例如上面的 value)是不可变,如果需要修改,请直接更改视图中可变值(t)。...多个 onChange 执行顺行 严格按照视图树渲染顺序,下面的代码,onChange 执行顺序为内到外: struct ContentView: View { @State var text...不会因为更早顺序前 onChange 对值内容进行更改而变化。

    2.9K20

    SwiftUI 布局协议 - Part2

    当我们改变角度时,SwiftUI 会计算好每个视图最初和最终位置,然后在动画期间内修改它们位置,A点到B点成一条直线。...起初它似乎没有这样做,但是检查下面这个动画,集中注意观察单个视图,看看它们是如何都跟随直虚线移动? 你有想过如果动画角度是0到360会发生什么吗?给你一分钟... 对!...什么都不会发生。...我之前提到过 LayoutValues 并不局限于传递 CGFloats ,你可以将它用于任何事情,包括Binding,在这个例子,我们将使用 Binding: struct Rotation...= nil } 注意:我称它为双向自定义值,因为信息是可以双向流动,但是,这不是 SwiftUI 官方术语,只是为了清晰解释这个想法术语。...这是个老问题,我在 SwiftUI 刚发布时候就写过此类问题,在 Safely Updating The View State [1] 一文可以查看更多信息。 我还想再提一下潜在崩溃。

    2.7K30

    如何在 SwiftUI 熟练使用 sensoryFeedback 修饰符

    = nil { generator.selectionChanged() } } }}在 iOS 17 ,Apple 直接向 SwiftUI 添加了一系列感觉反馈视图修饰符...我们还将存储 results 属性定义为触发器。这意味着 SwiftUI 将在存储结果更改时播放成功样式触觉反馈。...有三种感觉反馈视图修饰符变体:当值更改时触发struct ListView: View { @Binding var store: Store var body: some View {...当触发器值更改时,反馈会播放。使用条件闭包触发如果要更灵活地控制何时触发反馈,请使用带有条件闭包版本视图修饰符。...你可以根据需要进行进一步调整和扩展。总结SwiftUI引入了新sensoryFeedback视图修饰符,为所有Apple平台提供触觉反馈。

    13721

    SwiftUI数据流之State&Binding

    在引用包装为@State属性是,如果是读写都有,引用属性需要$开头(注释3处),如果只读直接使用变量名即可(注释2处) State针对具体View内部变量进行管理,不应该外部被允许访问,所以应该标记为...@Binding作用是在保存状态属性和更改数据视图之间创建双向连接,将当前属性连接到存储在别处单一数据源(single source of truth),而不是直接存储数据。...通常使用场景是把当前View@State值类型传递给其子View,如果直接传递@State值类型,将会把值类型复制一份copy,那么如果子View对值类型某个属性进行修改,父View不会得到变化...变量,anotherFlag是没有使用属性包装器普通变量,同时增加了一个mutating方法changeAnotherFlag被设计修改anotherFlag; 在body通过几种方式对两个变量进行修改...属性包装器针对值类型进行状态管理,用于在Structmutable值类型,它所有相关操作和状态改变和当前 View 生命周期保持一致 Binding将存储在别处值语意属性转换为引用语义,在使用时需要在变量名加

    4.1K30

    SwiftUI-数据流

    SwiftUI界面是严格数据驱动:运行时界面的修改,只能通过修改数据来间接完成,而不是直接对界面进行修改操作。...数据处理基本原则 Data Access as a Dependency:在 SwiftUI 数据一旦被使用就会成为视图依赖,也就是说当数据发生变化了,视图展示也会跟随变化,不会像 MVC 模式下那样要不停同步数据和视图之间状态变化...5.1 新特性 Property Wrapper来实现一种属性装饰语法糖(修饰器/装饰器) Property 这种形式最简单,就是在 View定义常量或者变量,然后在内部使用 import SwiftUI...@Binding 主要有两个作用: 在不持有数据源情况下,任意读取。 @State 获取数据应用,并保持同步。...不过值类型在传递时会发生复制操作,所以给传递后值类型即使属性更新了也不会触发最初传过来值类型重新赋值,所以界面并不会刷新,此时需要用@Binding,因为它可以将值类型转为引用类型,这样在传递时

    10.2K20

    掌握 SwiftUI Safe Area

    在 UIKit ,开发者需要利用 safeAreaInsets 或 safeAreaLayoutGuide ,才能确保将视图放置在界面可见部分。 SwiftUI 对上述过程进行了彻底简化。...本文将探讨如何在 SwiftUI 获取 SafeAreaInsets、将视图绘制到安全区域之外、修改视图安全区域等内容。...在 SwiftUI ,开发者通常只有在需要获取 StatusBar + NavBar 高度或 HomeIndeicator + TabBar 高度时才会使用到 safeAreaInsets 。... iOS 14 开始,SwiftUI 计算视图安全区域时,将软键盘在屏幕上覆盖区域(iPadOS 下,将软键盘缩小后键盘覆盖区域将被忽略)也一并进行考虑。...safeAreaTabbarDemo1 我们只调整了安全区域, SwiftUI 会自动在不同设备上进行适配(在 iPhone 13 上,状态条高度为 40 + HomeIndeicator区域高度

    7.7K31

    ObservableObject研究

    State(状态集合)任何单一元素发生变化都将通知所有与Store有依赖View进行重绘。 我就以上几点逐条进行分析。...详细分析请参见 @State研究 即使你只在View中发送action,并没有显示State数据或使用其做判断,该View也会被强制刷新。...首先不要在代码添加不必要依赖声明;对于那些只需要发送Action但并不使用StateView,将store定义成全部变量,无需注入直接使用。...•每个View可以根据自己需要同State元素建立依赖关系,State其他无关变化不会导致其被强制刷新•State数据仍然支持Binding等操作,而且能够支持各种形式结构设定 基于以上几点...(for: \.name)) 7、对于复杂State元素设计Binding支持。

    2.4K60
    领券