首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI列表中基于约束的图像布局

SwiftUI列表中基于约束的图像布局
EN

Stack Overflow用户
提问于 2021-03-05 00:25:33
回答 1查看 318关注 0票数 1

我希望在SwiftUI List中实现以下基于约束的图像布局

  • 将每个Image的左右边引脚到列表边距(适合屏幕大小)
  • 基于高宽比的动态高度(我也可以用固定的高度)
  • 保持图像的纵横比,内容应该填满空间。

我已经尝试过但不起作用的内容(基于这篇文章):

代码语言:javascript
复制
struct MyView: View {
  @ObservedObject var viewModel: MyViewModel
  let aspectRatio = CGSize(width: 345, height: 120)

  var body: some View {
    List {
      ForEach(viewModel.items) { item in
        GeometryReader { geo in
          Image("test_image")
            .resizable()
            .aspectRatio(aspectRatio, contentMode: .fill)
            .frame(width: geo.size.width)
            .clipped()
        }
      }
    }
  }
}

我从geo得到的尺寸在iPhone 11 Pro上是(343,32)。宽度是合理的,但它不让细胞膨胀超过32的高度,出于某种原因。任何技巧欢迎,因为我真的开始想念汽车布局限制。

EN

回答 1

Stack Overflow用户

发布于 2021-03-05 00:39:42

没有必要在这种情况下使用GeometryReader。对于固定高度,您只需向frame提供height。您也不需要创建您自己的let aspectRatio = CGSize(width: 345, height: 120) --如果您保留它为零(默认情况下),它应该是好的。

编辑:用padding代替带间距的VStack

代码语言:javascript
复制
struct MyView: View {
    var body: some View {
        List {
            ForEach(0..<10, id: \.self) { item in
                Image("test_image")
                    .resizable()
                    .aspectRatio(contentMode: .fill) /// no need for custom aspect ratio
                    .frame(height: 120) /// fixed height of image
                    .clipped() /// stop image from overflowing
                    .padding(.vertical, 12) /// extra vertical padding
            }
        }
    }
}

结果(与形象“):

然而,这有一个固定的120高度,所以图像的顶部和底部是裁剪出来的。要解决这个问题,您可以完全避免使用frameclipped

代码语言:javascript
复制
struct MyView: View {
    var body: some View {
        List {
            ForEach(0..<10, id: \.self) { item in
                Image("test_image")
                    .resizable()
                    .aspectRatio(contentMode: .fill) /// doesn't matter if it's fit or fill
                    .padding(.vertical, 12) /// extra vertical padding
            }
        }
    }
}

结果:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66485007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档