You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI开发:如何在椭圆形父图形边缘均匀添加子图形

问题解答:在椭圆形边缘均匀分布圆形子视图

完全可以实现,以下是修改后的SwiftUI代码,能让圆形座位均匀分布在椭圆形牌桌边缘:

struct PokerTableView: View {
    @Binding var tableSize: CGSize
    @State var numberOfSeats: Int = 9
    // 可根据需求调整座位大小
    private let seatSize: CGFloat = 40
    
    var body: some View {
        GeometryReader { imgGeo in
            ZStack {
                // 椭圆形牌桌
                RoundedRectangle(cornerRadius: 200)
                    .fill(.gray)
                    .stroke(Color(hex: 0x1F2C21, alpha: 0.4), lineWidth: 2)
                    .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 140)
                    .padding(30)
                
                // 生成均匀分布的座位
                ForEach(0..<numberOfSeats, id: \.self) { index in
                    Circle()
                        .fill(Color.white)
                        .stroke(Color.black, lineWidth: 2)
                        .frame(width: seatSize, height: seatSize)
                        .position(positionForSeat(at: index, in: imgGeo.size))
                }
            }
        }
    }
    
    // 计算每个座位的位置
    private func positionForSeat(at index: Int, in containerSize: CGSize) -> CGPoint {
        let tableWidth = containerSize.width - 60 // 减去两侧padding的总和
        let tableHeight = 140 // 牌桌固定高度
        let centerX = containerSize.width / 2
        let centerY = containerSize.height / 2
        
        // 计算当前座位对应的弧度角度
        let angle = 2 * CGFloat.pi * CGFloat(index) / CGFloat(numberOfSeats)
        // 椭圆的半长轴与半短轴
        let a = tableWidth / 2
        let b = tableHeight / 2
        
        // 椭圆参数方程计算坐标,加上座位半径偏移让座位贴在牌桌外侧
        let x = centerX + (a + seatSize/2) * cos(angle)
        let y = centerY + (b + seatSize/2) * sin(angle)
        
        return CGPoint(x: x, y: y)
    }
}

// 补全原代码用到的十六进制Color扩展
extension Color {
    init(hex: UInt32, alpha: Double = 1.0) {
        let red = Double((hex >> 16) & 0xff) / 255
        let green = Double((hex >> 8) & 0xff) / 255
        let blue = Double(hex & 0xff) / 255
        self.init(red: red, green: green, blue: blue, opacity: alpha)
    }
}

核心实现逻辑:

  • 用ForEach循环生成指定数量的圆形座位
  • 基于椭圆参数方程计算每个座位的位置,通过等分圆周角度实现均匀分布
  • 坐标计算时加入座位半径偏移,确保座位刚好贴合在牌桌边缘外侧
  • 保留原代码的牌桌样式,同时适配容器尺寸

期望效果示意图:
椭圆形牌桌带均匀分布座位

内容的提问来源于stack exchange,提问作者David W

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:40:07