View 嵌入应用程序时视图未正确渲染

View 嵌入应用程序时视图未正确渲染,view,swiftui,View,Swiftui,我有一个视图结构,可以在预览中呈现ok,但嵌入到应用程序中时不会。该视图用于显示图像文件,当骰子更改值时工作正常。现在它已更改为动态绘图,它已停止正常工作。它保持显示与第一个值相同数量的点,并在重画时将点放错位置 以下是视图的代码: import SwiftUI struct DiceView: View { var dice: NubbleGame.Dice var color: Color = Color.red let dotSizeDivisor = 5 var body: so

我有一个视图结构,可以在预览中呈现ok,但嵌入到应用程序中时不会。该视图用于显示图像文件,当骰子更改值时工作正常。现在它已更改为动态绘图,它已停止正常工作。它保持显示与第一个值相同数量的点,并在重画时将点放错位置

以下是视图的代码:

import SwiftUI

struct DiceView: View {

var dice: NubbleGame.Dice
var color: Color = Color.red

let dotSizeDivisor = 5

var body: some View {
    GeometryReader
    { viewSize in
        
        let smallestSide = min(viewSize.size.width, viewSize.size.height)
        let dotSize = smallestSide/CGFloat(dotSizeDivisor)
        ZStack()
        {
            RoundedRectangle(cornerRadius: smallestSide/10)
                .stroke(Color.black, lineWidth: viewSize.size.width/50)
            ForEach(0..<dice.currentValue)
            { i in
                ZStack()
                {
                    Circle()
                        .fill(color)
                        .position(getPositionForDot(dotNumber: i+1, diceValue: dice.currentValue, diceSize:smallestSide))
                        .frame(width: dotSize, height: dotSize, alignment: .center)
                    Circle()
                        .stroke(Color.black, lineWidth: 2)
                        .position(getPositionForDot(dotNumber: i+1, diceValue: dice.currentValue, diceSize:smallestSide))
                        .frame(width: dotSize, height: dotSize, alignment: .center)
                }
            }
        }
    }
}

func getPositionForDot(dotNumber: Int, diceValue: Int, diceSize: CGFloat) -> CGPoint
{
    var tempDiceValue = diceValue
    var tempDotNumber = dotNumber
    let zero = CGFloat(diceSize/CGFloat(dotSizeDivisor))
    let offSet = CGFloat((diceSize * 0.9) / 2)
    let center = CGFloat(diceSize/2)
    var thisDot: CGPoint = CGPoint(x: 0, y: 0)
    if diceValue%2 != 0
    {
        if dotNumber == 1
        {
            return CGPoint(x: (diceSize/2) - offSet, y: (diceSize/2) - offSet)
        }
        else
        {
            tempDiceValue = diceValue - 1
            tempDotNumber = dotNumber - 1
        }
    }
    for i in 1..<tempDotNumber+1
    {
        if tempDiceValue % 2 == 0
        {
            if i == 1
            {
                thisDot = CGPoint(x: zero - offSet, y: zero - offSet)
            }
            else if i == 2
            {
                thisDot = CGPoint(x: diceSize - zero - offSet, y: (diceSize - zero) - offSet)
            }
            else if i == 3
            {
                thisDot = CGPoint(x: (diceSize - zero) - offSet, y: zero - offSet)
            }
            else if i == 4
            {
                thisDot = CGPoint(x: zero - offSet, y: (diceSize - zero) - offSet)
            }
            else if i == 5
            {
                thisDot = CGPoint(x: zero - offSet, y: diceSize/2 - offSet)
            }
            else if i == 6
            {
                thisDot = CGPoint(x: (diceSize - zero) - offSet, y: center - offSet)
            }
            else if i == 7
            {
                thisDot = CGPoint(x: center - offSet, y: center-diceSize/(CGFloat(dotSizeDivisor)) - offSet)
            }
            else if i == 8
            {
                thisDot = CGPoint(x: center - offSet, y: center+diceSize/(CGFloat(dotSizeDivisor)) - offSet)
            }
        }
    }

    return thisDot
}
}
…这是模型中的骰子结构:

struct Dice: Identifiable
{
    var id: Int
    var numberOfSides: Int
    var currentValue: Int
}

任何帮助都将不胜感激!谢谢大家!

问题出在画点的前循环中。。。这个答案有解决办法。它必须是可识别的

struct Dice: Identifiable
{
    var id: Int
    var numberOfSides: Int
    var currentValue: Int
}