当前位置: 首页 > 知识库问答 >
问题:

框架的SwiftUI行为(高度:零)

阴靖
2023-03-14

我得到了一个线程问题,它说“无效的框架维度(负的或非有限的)。”

以下是我的代码:

struct CellStyle: ViewModifier {
    func body(content: Content) -> some View {
        content
            .frame(width: .infinity, height: 56, alignment: .center)
            .padding(.horizontal, 16)
    }
}

代码运行得很好,它似乎做了它应该做的事情,所以我很困惑为什么它会给我线程问题。为什么代码运行时没有有限的宽度/高度,这与Apple Docs相矛盾?(见下文“一些阅读”部分)

这段代码很好地修复了这个问题,但我仍然希望理解为什么前面的代码不会崩溃或创建错误。

struct CellStyle: ViewModifier {
    func body(content: Content) -> some View {
        content
            .frame(height: 56, alignment: .center)
            .frame(maxWidth: .infinity)
            .padding(.horizontal, 16)
    }
}

就我所知,它给了我线程问题,因为我告诉.frame,我想要一个不是有限的宽度,而它想要一个有限的宽度。

关于堆栈溢出的其他问题

我发现有两个问题问同样的事情:
iOS 14无效的帧尺寸(负的或非有限的)

SwiftUI iOS14 GeometryReader框架尺寸无效

在第一个问题中,线程问题是有意义的,因为给定代码.frame(width:p.size.width-padding)不能保证p.size.width会小于padding。就我所知,这是一个给定值可以为负的问题。
这个问题与给定值不是有限的有关,所以问题没有联系。
第二个问题还没有回答,有点模糊,所以现在对我没有什么帮助。也许以后有人会给出一个有用的答案,但到目前为止,这还没有帮助。

查看苹果文档,我发现:

使用此方法可为视图的宽度、高度或两者指定固定大小。如果只指定其中一个维度,结果视图将在其他维度中采用此视图的大小调整行为。

那么,为什么.frame(宽度:.infinity,高度:56,对齐方式:.center)会运行呢?
Apple所说的“结果视图假定此视图在其他维度中的大小调整行为”是什么意思?它是否总是假设视图是一个“推出”视图,从而给出与.infinity相同的结果?

我对此进行了测试并运行了以下代码:

struct CellStyle: ViewModifier {
    func body(content: Content) -> some View {
        content
            .frame(height: 56, alignment: .center)
            .padding(.horizontal, 16)
    }
} 

它似乎给出了相同的结果,所以现在我很好奇是否有一种情况,在这种情况下,快速“假设”宽度会导致.infinity
以外的行为

.frame(width:.infinity).frame(width:nil)(相当于发射width或height)之间的行为差异是什么。

func框架(宽度:CGFLOAT?=零,高度:CGFLOAT?=零,对齐:对齐=.中心)->某些视图

苹果文档

谢谢你的帮助!

共有1个答案

薛弘阔
2023-03-14

因为它是文档化的接口契约:

/// - Parameters:
///   - width: A fixed width for the resulting view. If `width` is `nil`,
///     the resulting view assumes this view's sizing behavior.
///   - height: A fixed height for the resulting view. If `height` is `nil`,
///     the resulting view assumes this view's sizing behavior.
///   - alignment: The alignment of this view inside the resulting view.
///     `alignment` applies if this view is smaller than the size given by
///     the resulting frame.
///
/// - Returns: A view with fixed dimensions of `width` and `height`, for the
///   parameters that are non-`nil`.
@inlinable public func frame(width: CGFloat? = nil, height: CGFloat? = nil, alignment: Alignment = .center) -> some View

而带有最小/最大参数的修饰符类型允许灵活的约束(这里没有复制--在生成的SwiftUI模块中读取)。

 类似资料:
  • 问题内容: 我开始探索SwiftUI,但找不到一种简单的方法:我希望View具有成比例的高度(基本上是其父代高度的百分比)。假设我有3个垂直堆叠的视图。我想要: 第一个达到其父母身高的43% 第二高为(其父母身高的)37% 最后一个高度是其父高的20% 我观看了WWDC19中关于SwiftUI中自定义视图的这段有趣视频(https://developer.apple.com/videos/play

  • 主要内容:1.Disruptor介绍,2.Disruptor 的核心概念,3.demo1.Disruptor介绍 Disruptor是一个开源的Java框架,它被设计用于在生产者—消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS)和尽量低的延迟。 从功能上来看,Disruptor 是实现了“队列”的功能,而且是一个有界队列。那么它的应用场景自然就是“生产者-消费者”模型的应用场合了。 其实Disruptor与其说是一个框架,不

  • 问题内容: Tkinter窗口的大小可以通过以下方法控制: 是否有等效的方法来控制Tkinter或ttk帧的大小? @Bryan:我将您的frame1.pack代码更改为以下代码: 我添加了此事件处理程序: 上面的事件处理程序检测到帧的宽度太大,但是无法防止大小增加。这是Tkinter的限制,还是我误解了您的解释? 问题答案: 没有单个魔术功能可以将帧强制为最小或固定大小。但是,您可以通过为框架指

  • 本文向大家介绍解释行为驱动框架。,包括了解释行为驱动框架。的使用技巧和注意事项,需要的朋友参考一下 行为驱动框架从项目中的所有涉众那里获取信息,比如开发人员、测试人员、产品所有者、经理、客户和业务分析师。这个想法是为了让项目的每个成员都有相同的理解。 行为驱动框架致力于团队中每个人之间的协作和协调。技术编码知识是不必要的,因为功能需求或规范是用非技术性的,通用的语言描述的。 在自动和手动测试人员设

  • 我正在尝试嵌入一个使用另一个框架的框架,这个框架在模拟器中工作得很好,但在iOS设备上会崩溃: DYLD:未加载库:@rpath/framework.framework/frameworkB引用自:/private/var/mobile/containers/bundle/application/b072cd7c-8595-4AE4-a506-26832a0f4402/frameworktest.

  • 问题内容: 我的CSS中包含以下内容。所有边距/边距/边界均全局重置为0。 现在,当我将HTML编写为 页面正确呈现。但是,当我检查元素时,显示为高。我会一直期待它扩大,直到年底和…为什么会出现这种情况? 同样,页面呈现良好。这种行为使我感到困惑。 问题答案: 浮动内容不会影响其容器的高度。元素不包含不浮动的内容(因此,没有什么可以阻止容器的高度为0,就好像它是空的一样)。 在容器上进行设置将通过