- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个 View 来显示从SwiftUI HStack with Wrap获得的多行文本标签,但是当我将其添加到VStack中时,这些标签会与下面放置的任何其他 View 重叠。
标签显示正确,但是 View 本身的高度未在VStack内部计算。
如何使此 View 使用内容的高度?
import SwiftUI
struct TestWrappedLayout: View {
@State var platforms = ["Ninetendo", "XBox", "PlayStation", "PlayStation 2", "PlayStation 3", "PlayStation 4"]
var body: some View {
GeometryReader { geometry in
self.generateContent(in: geometry)
}
}
private func generateContent(in g: GeometryProxy) -> some View {
var width = CGFloat.zero
var height = CGFloat.zero
return ZStack(alignment: .topLeading) {
ForEach(self.platforms, id: \.self) { platform in
self.item(for: platform)
.padding([.horizontal, .vertical], 4)
.alignmentGuide(.leading, computeValue: { d in
if (abs(width - d.width) > g.size.width)
{
width = 0
height -= d.height
}
let result = width
if platform == self.platforms.last! {
width = 0 //last item
} else {
width -= d.width
}
return result
})
.alignmentGuide(.top, computeValue: {d in
let result = height
if platform == self.platforms.last! {
height = 0 // last item
}
return result
})
}
}
}
func item(for text: String) -> some View {
Text(text)
.padding(.all, 5)
.font(.body)
.background(Color.blue)
.foregroundColor(Color.white)
.cornerRadius(5)
}
}
struct TestWrappedLayout_Previews: PreviewProvider {
static var previews: some View {
TestWrappedLayout()
}
}
struct ExampleTagsView: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
Text("Platforms:")
TestWrappedLayout()
Text("Other Platforms:")
TestWrappedLayout()
}
}
}
}
struct ExampleTagsView_Previews: PreviewProvider {
static var previews: some View {
ExampleTagsView()
}
}
最佳答案
好的,这是一个更通用且经过改进的变体(对于SwiftUI HStack with Wrap中最初引入的解决方案)
经过Xcode 11.4/iOS 13.4测试
注意:由于 View 高度是动态计算的,因此结果在运行时有效,而不是在预览中有效
struct TagCloudView: View {
var tags: [String]
@State private var totalHeight
= CGFloat.zero // << variant for ScrollView/List
// = CGFloat.infinity // << variant for VStack
var body: some View {
VStack {
GeometryReader { geometry in
self.generateContent(in: geometry)
}
}
.frame(height: totalHeight)// << variant for ScrollView/List
//.frame(maxHeight: totalHeight) // << variant for VStack
}
private func generateContent(in g: GeometryProxy) -> some View {
var width = CGFloat.zero
var height = CGFloat.zero
return ZStack(alignment: .topLeading) {
ForEach(self.tags, id: \.self) { tag in
self.item(for: tag)
.padding([.horizontal, .vertical], 4)
.alignmentGuide(.leading, computeValue: { d in
if (abs(width - d.width) > g.size.width)
{
width = 0
height -= d.height
}
let result = width
if tag == self.tags.last! {
width = 0 //last item
} else {
width -= d.width
}
return result
})
.alignmentGuide(.top, computeValue: {d in
let result = height
if tag == self.tags.last! {
height = 0 // last item
}
return result
})
}
}.background(viewHeightReader($totalHeight))
}
private func item(for text: String) -> some View {
Text(text)
.padding(.all, 5)
.font(.body)
.background(Color.blue)
.foregroundColor(Color.white)
.cornerRadius(5)
}
private func viewHeightReader(_ binding: Binding<CGFloat>) -> some View {
return GeometryReader { geometry -> Color in
let rect = geometry.frame(in: .local)
DispatchQueue.main.async {
binding.wrappedValue = rect.size.height
}
return .clear
}
}
}
struct TestTagCloudView : View {
var body: some View {
VStack {
Text("Header").font(.largeTitle)
TagCloudView(tags: ["Ninetendo", "XBox", "PlayStation", "PlayStation 2", "PlayStation 3", "PlayStation 4"])
Text("Some other text")
Divider()
Text("Some other cloud")
TagCloudView(tags: ["Apple", "Google", "Amazon", "Microsoft", "Oracle", "Facebook"])
}
}
}
关于swift - 具有环绕和动态高度的SwiftUI HStack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62102647/
我想要 Text("111")具有与 VStack 相同的高度包含 2222... 和 333.... struct Test7: View { var body: some View { H
Desired output 寻找一种在不均匀元素中拆分 HStack 的方法,一个占据屏幕的 1/2,另外两个占据屏幕的 1/4(见附件)。 代码: struct MyCategoryRow:
我有这个 View 来显示从SwiftUI HStack with Wrap获得的多行文本标签,但是当我将其添加到VStack中时,这些标签会与下面放置的任何其他 View 重叠。 标签显示正确,但是
我创建了一个带有水平堆栈 View (标签、按钮、按钮)的简单列表。每个按钮都有自己的按钮操作,但是当我运行时,我可以看到点击一个按钮会打印两个操作。断点也出现在这两个 Action 中。她是我的代码
我一直在尝试制作具有 HStack 的 View 与 Image在其中,Image设置为可通过 aspectRatio 调整大小的 .fill .不知何故,它破坏了所有框架并在布局中引入了空间 例如,
我创建了一个带有水平堆栈 View (标签、按钮、按钮)的简单列表。每个按钮都有自己的按钮操作,但是当我运行时,我可以看到点击一个按钮会打印两个操作。断点也出现在两个 Action 中。她是我的密码
当我使用 CountVectorizer 等生成的一些稀疏矩阵的 scipy.sparse.hstack 时,我想合并它们以用于回归,但不知何故它们速度较慢: X1 有 10000 个来自 analy
我正在使用 HStack 在我的 View 层次结构中布置一些元素。我希望能够有条件地翻转元素的顺序。 HStack { Text("Hello") Text("World") } 我的想法是
下面的命令可以很好地堆叠两个具有左右 alpha channel 的 png 文件,输出 png 文件也将保留 alpha channel 。 ffmpeg -i a.png -i b.png -fi
我目前正在尝试水平堆叠多个视频文件并收到此错误 [libvorbis @ 000001bb38f23a80] Queue input is backward in timerate=N/A speed
我试图让键盘上的按钮在水平方向上彼此靠得更近。首先我尝试调整按钮框架的宽度。但是我发现,如果我减小框架宽度,一些像“W”这样的长宽字符将无法正确显示。 然后我尝试将 HStack 的间距设置为负数,就
hstack FFmpeg 命令的问题困扰着我。 input1 和 input2 都是垂直 360x640 视频。我将 input1 裁剪成一个正方形,将其与 input2 垂直合并,然后在生成的视频
我有一个 HStack: struct BottomList: View { var body: some View { HStack() { ForE
我正在尝试执行此代码: for i in Fil: for k in DatArr: a = np.zeros(0) for j in Bui:
我对 numpy.hstack() 函数有问题。我有三个相同的 numpy 数组,我想使用 hstack() 将它们连接起来,所以我从这些 numpy 数组创建元组并使用 numpy.hstack(t
我有两个 csr 稀疏矩阵。一个包含来自 sklearn.feature_extraction.text.TfidfVectorizer 的转换,另一个包含从 numpy 数组转换而来的转换。我试图对
这个问题在这里已经有了答案: How to extend an array in-place in Numpy? (4 个答案) 关闭 8 年前。 我是 Python 的新手,不确定为什么当我使用
我有以下矩阵: >>> X1 shape: (2399, 39999) type: scipy.sparse.csr.csr_matrix 和 >> X2 shape: (2399, 333534)
给定一个矩阵数组 matrices_w 我想在每个矩阵上应用 np.hstack 函数: matrices_w = np.asarray([[[1,2,3],[4,5,6]],[[9,8,7],[6,
我目前有一个 numpy 多维数组(float 类型)和一个 numpy 列数组(int 类型)。我想将两者组合成一个多维 numpy 数组。 import numpy >> dates.shape
我是一名优秀的程序员,十分优秀!