ios - 如何在 SwiftUI HStack 中隐藏剪辑视图
问题描述
SwiftUI 中是否有可能在一行中只显示尽可能多的(固定大小)视图而不进行裁剪,例如裁剪视图的一部分。
示例布局
-----------------------------------------
| |
| ------- ------- ------- ------- -------
| | VIEW1 | | VIEW2 | | VIEW3 | | VIEW4 | | VIEW5 |
| ------- ------- ------- ------- -------
| |
-----------------------------------------
在这个例子VIEW5
中应该被隐藏,因为它完全超出了父视图的范围。这可以通过.clipped()
.
VIEW4
也应该是完全隐藏的!因为如果它要显示,它必须被切断。所有其他视图应正常呈现。
SwiftUI 布局
此初始尝试存在以下问题:
- 由于 the 的宽度
itemView
比外部大得多VStack
,所以前缘没有对齐 => ☑️解决方案 - ❌最后一个视图可能是可见的,即使它没有完全显示在屏幕上。应该避免这种情况。
struct DemoView: View {
let items: [String]
@State private var totalHeight = CGFloat.zero
var body: some View {
VStack(alignment: .leading) {
Text("Demo View:")
itemView
.padding()
.background(Color.green)
}
}
private var itemView: some View {
HStack {
ForEach(items, id: \.self) { item in
Text(item)
.lineLimit(1)
.fixedSize()
.padding(.all, 5)
.font(.body)
.background(Color.blue)
.foregroundColor(Color.white)
.cornerRadius(5)
}
}
.frame(maxWidth: 350)
}
}
#if DEBUG
struct DemoView_Previews: PreviewProvider {
static var items: [String] = (2000..<2020).map(String.init)
// .map { item in
// Bool.random() ? item : item + item
// }
static var previews: some View {
DemoView(items: items)
// .previewLayout(.sizeThatFits)
}
}
#endif
解决方案
使用裁剪并在HStack
框架上对齐(使用 Xcode 12.1 / iOS 14.1 测试)
private var itemView: some View {
HStack {
ForEach(items, id: \.self) { item in
Text(item)
.lineLimit(1)
.fixedSize()
.padding(.all, 5)
.font(.body)
.background(Color.blue)
.foregroundColor(Color.white)
.cornerRadius(5)
}
}
.frame(maxWidth: 350, alignment: .leading)
.clipped()
}
推荐阅读
- c# - 使用 MVC 的 ON DELETE CASCADE 的特殊权利
- jenkins-pipeline - 在 Jenkinsfile 中传递从 shell 中提取的变量时出错
- python - python中的for循环查找列表的总和
- cordova - 如何修复某些设备上相机流的“拉伸视图”(getUserMedia)
- ios - 在 iOS 应用程序中使用 Twitter 登录
- ajax - 如何使用 django 和 ajax 进行星级评分?
- android - 颤振中的 MissingPluginException
- matlab - Matlab中的fmincon输入参数太多
- python-3.x - Using list comprehension with iloc, isna(), sum() and if statement
- firebase - Firebase 身份验证服务