Shape erstellen ?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Shape erstellen ?

    Hallo zusammen,

    Mein Problem ist folgendes, Ich möchte sobald ich auf den Button drücke ein Rectangle gezeichnet wird ( das geht soweit ) jetzt möchte ich aber das durch erneutes drücken ein zweites Rectangle gezeichnet wird und das alte NICHT gelöscht wird.

    Ich stehe irgendwie auf dem Schlau und komme einfach nicht auf die Lösung, ich hoffe jemand kann mir dabei helfen. :)

    Quellcode

    1. struct ContentView: View {
    2. @State private var isTapped = true
    3. @State var index = 0
    4. @State var scX = UIScreen.main.bounds.size.width
    5. @State var scY = UIScreen.main.bounds.size.height
    6. var body: some View {
    7. HStack {
    8. //Button
    9. Button(action: {
    10. self.isTapped.toggle()
    11. index += 1
    12. }) {
    13. Text("1")
    14. .padding()
    15. .foregroundColor(.black)
    16. .background(
    17. RoundedRectangle(cornerRadius: 10)
    18. .stroke(Color.black, lineWidth: 3)
    19. .frame(width: 75, height: 75)
    20. )
    21. }.position(CGPoint(x: 55, y: 395))
    22. // Add Rectangle
    23. HStack{
    24. if isTapped {
    25. RoundedRectangle(cornerRadius: 10, style: .continuous)
    26. .frame(width: 50, height: 50)
    27. .position(x: .random(in: 50...scX - 75), y: .random(in: 50...scY - 75))
    28. .foregroundColor(Color.red)
    29. }
    30. }
    31. }
    32. }
    Alles anzeigen
  • Was mich etwas wundert an deinem Code... Du initialisierst isTapped mit dem Wert "true" und schreibst dann im zweiten HStack

    if isTapped {...}


    Sobald du deinen Code startest müsste er doch, ganz unabhängig davon, ob ein Button gedrückt wird oder nicht, ein Rectangle zeichnen oder nicht? Du gehst ja immerhin davon aus, dass bei Start bereits getappt wurde.
    Und durch dein Button click setzt du isTapped dann auf false.

    Für das genannte Problem hilft dir ggf. dieser StackOverflow Beitrag :)
    stackoverflow.com/questions/70…ng-a-foreach-loop-swiftui
  • Hier mal eine einfache Variante, wie das aussehen könnte:

    Quellcode

    1. struct ContentView: View {
    2. struct MyRectangle: Identifiable {
    3. let id = UUID()
    4. let x: Double
    5. let y: Double
    6. }
    7. @State private var rectangles: [MyRectangle] = []
    8. var body: some View {
    9. GeometryReader { geo in
    10. ZStack {
    11. Button {
    12. addRectangle(proxy: geo)
    13. } label: {
    14. Text("\(rectangles.count)")
    15. .padding()
    16. .foregroundColor(.black)
    17. .background(
    18. RoundedRectangle(cornerRadius: 10)
    19. .stroke(Color.black, lineWidth: 3)
    20. .frame(width: 75, height: 75)
    21. )
    22. }.position(CGPoint(x: 55, y: 395))
    23. ForEach(rectangles) { rectangle in
    24. RoundedRectangle(cornerRadius: 10, style: .continuous)
    25. .frame(width: 50, height: 50)
    26. .position(x: rectangle.x, y: rectangle.y)
    27. .foregroundColor(Color.red)
    28. }
    29. }
    30. }
    31. }
    32. func addRectangle(proxy geo: GeometryProxy) {
    33. let x = Double.random(in: 50...geo.size.width - 75)
    34. let y = Double.random(in: 50...geo.size.height - 75)
    35. rectangles.append(MyRectangle(x: x, y: y))
    36. }
    37. }
    Alles anzeigen

    Statt den HStack musst du einen ZStack nehmen, da ansonsten die Positionierung nicht klappt. Für die verfügbare Größe habe ich auch mal einen GeometryReader genommen und nicht die Gerätegröße.
    So Long, and Thanks for All the Fish.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Babelfisch () aus folgendem Grund: Ergänzung