我试图使一个5星级使用矩形和掩盖它的形状的星星.当矩形是全宽(5星级)时,一切似乎都很好,但当它是其他任何东西时,对齐不起作用.

struct FiveStarRating: View {
    @State private var rating = 0
    var body: some View {
        stars.overlay(alignment: .leading) {
            GeometryReader { proxy in
                Rectangle()
                    .foregroundStyle(.orange)
                    .frame(width: CGFloat(rating) / 5 * proxy.size.width)
                    .animation(.bouncy, value: rating)
                    .allowsHitTesting(false)
                    .mask(stars)
            }
        }
    }

    private var stars: some View {
        HStack {
            ForEach(1...5, id:\.self) { i in
                Image(systemName: "star.fill")
                    .foregroundStyle(.gray)
                    .font(.largeTitle)
                    .onTapGesture {
                        rating = i
                    }
            }
        }
    }
}

推荐答案

您可以再添加一个frame修改器,以确保覆盖占据整个空间(但仍然是leading对齐的),同时保持Rectangle约束到某个width:

struct FiveStarRating: View {
    @State private var rating = 0
    var body: some View {
        stars
            .overlay{
            GeometryReader { proxy in
                Rectangle()
                    .foregroundStyle(.orange)
                    .frame(width: CGFloat(rating) / 5 * proxy.size.width)
                    .frame(maxWidth: .infinity, alignment: .leading) // <-- Here
                    .animation(.bouncy, value: rating)
                    .allowsHitTesting(false)
                    .mask(stars)
            }
        }
    }
    
    private var stars: some View {
        HStack {
            ForEach(1...5, id:\.self) { i in
                Image(systemName: "star.fill")
                    .foregroundStyle(.gray)
                    .font(.largeTitle)
                    .onTapGesture {
                        rating = i
                    }
            }
        }
    }
}

Swift相关问答推荐

如何防止自动状态恢复,如果应用程序被启动打开特定的文档?

通过SwiftUI中的列表 Select 从字典中检索值

如何将CodingKeys作为数组而不是枚举传递到类外部的函数中?

ARRaycast Query和前置摄像头(ARFaceTrackingConfiguration)

如何在每天午夜重置布尔值

如何在SWIFT任务中判断当前任务是否已取消(异步/等待)

当计数大于索引时,索引超出范围崩溃

MacOS 13-如何使用SwiftUI创建Message.App设置工具栏?

为什么这个快速代码不显示文本字段?

解码器是否需要具有密钥的外部数据表示?

在 Swift 5.7 中使用协议作为类型时什么时候需要写 `any`

如何在 macOS/AppKit 的窗口选项卡上接受拖动项目的放置?

单击按钮后的计时器发布者初始化计时器

在 Select 器上显示alert Select SwiftUI

如何使用 Date.ParseStrategy 在 Swift 5.6 中将字符串解析为日期?

为什么swiftui中的导航视图栏那么大?

在 Xcode 中自动实现 Swift 协议方法

如何使用 Swift 枚举作为字典键? (符合 Equatable)

Swift 中的可选数组与空数组

Swift UITableView reloadData 在一个闭包中