Größe des Bildschirms ermitteln

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

  • Größe des Bildschirms ermitteln

    Hallo!

    Ich möchte meine Elemente in Swift UI positionieren, z.B.:


    Quellcode

    1. var body: some View {
    2. NavigationView {
    3. VStack {
    4. Image("Tabita")
    5. .clipShape(Circle())
    6. .overlay(Circle().stroke(Color.white, lineWidth: 5))
    7. .shadow(radius: 10)
    8. .position(x: 205, y: 100)
    Allerdings passt die Position von x=205 und y=100 nur bei einem bestimmten Gerät, deshalb möchte ich die Maße des Bildschirms ausmessen - wie kann ich es mit SwiftUI tun?... Danke im Voraus für eure Mühe!
  • Noch ein Kommentar dazu: Mit UIKit war es früher kein Problem. Ich habe eine App geschrieben die lineare Funktionen zeichnen sollte, hier war es allein für das Zeichnen des Koordinatensystems wichtig die Mitte des Bildschirms zu bestimmen. Ich habe zuerst das Objekt Canvas gebildet:

    Quellcode

    1. class Canvas: UIView {
    2. var linien = [linie]()
    3. override func draw(_ rect: CGRect) {
    4. super.draw(rect)
    5. //zeichne_linie(x_start: 100, y_start: 100, x_ende: 300, y_ende: 300, farbe: .green, staerke: 2)
    6. //zeichne_linie(x_start: 200, y_start: 200, x_ende: 100, y_ende: 300, farbe: .red, staerke: 4)
    7. for linie in linien {
    8. zeichne_linie(linie: linie)
    9. }
    10. }
    11. func warenanlieferung(linie: linie) {
    12. linien.append(linie)
    13. setNeedsDisplay()
    14. }
    15. func zeichne_linie(linie: linie) {
    16. //draw(self.frame)
    17. guard let context = UIGraphicsGetCurrentContext() else {return}
    18. let startPoint = CGPoint(x: linie.x_start, y: linie.y_start)
    19. let endPoint = CGPoint(x: linie.x_ende, y: linie.y_ende)
    20. context.setStrokeColor(linie.farbe.cgColor)
    21. context.setLineWidth(linie.staerke)
    22. context.move(to: startPoint)
    23. context.addLine(to: endPoint)
    24. context.strokePath()
    25. }
    26. }
    Alles anzeigen


    Anschließend zog ich das Objekt Canvas heran um die Maße zu bestimmen:

    Quellcode

    1. func koordinatensystem(_ canvas: Canvas) {
    2. let bildschirm_breite = Double(canvas.bounds.width)
    3. let bildschirm_hoehe = Double(canvas.bounds.height)
    4. print("Bildschirm ist \(bildschirm_breite) x \(bildschirm_hoehe)")
    5. let x = Double(bildschirm_breite / 2)
    6. let y = Double(bildschirm_hoehe * 0.4)
    7. mittelpunkt["x"] = x
    8. mittelpunkt["y"] = y
    9. let x_max = bildschirm_breite - 20
    10. let y_max = bildschirm_hoehe * 0.8
    Wenn ich aber jetzt in einer gesonderten Datei das Objekt Canvas bilde und versuche hier einzubinden


    Quellcode

    1. import SwiftUI
    2. import UIKit
    3. struct menu: View {
    4. @State private var finanzen_pushed: Bool = false
    5. @State private var fed_pushed: Bool = false
    6. @State private var haushaltshilfe_pushed: Bool = false
    7. @State private var veranstaltungen_pushed: Bool = false
    8. var x_bild: CGFloat = 100
    9. var y_bild: CGFloat = 100
    10. init() {
    11. print("Versuche die Bildschirmmaße zu ermitteln")
    12. let canvas = Canvas()
    13. let screen = screen_size()
    14. screen.get_size(canvas)
    15. print("Breite ist \(screen.bildschirm_breite)")
    16. }
    Alles anzeigen
    ist meine Bildschirmbreite gleich 0.0. Gut - wenn es so nicht läuft, wie dann?
  • Allerdings habe ich noch ein Problem mit dem Positionieren.


    Quellcode

    1. struct pairing_erfolgreich: View {
    2. var body: some View {
    3. VStack {
    4. GeometryReader { geo in
    5. Button(action: {
    6. print("OK")
    7. }, label: {
    8. Text("Verbindung erfolgreich")
    9. })
    10. .font(.largeTitle)
    11. .frame(width: geo.size.width * 0.9, height: 80)
    12. //.position(x: geo.frame(in: .global).midX, y: 100)
    13. .foregroundColor(.white)
    14. .background(LinearGradient(gradient: Gradient(colors: [.red, .yellow]), startPoint: .topLeading, endPoint: .bottomTrailing))
    15. .cornerRadius(10)
    16. .padding(10)
    17. }
    18. }
    19. }
    20. }
    Alles anzeigen
    Ich kann die Breite des Frames nun wunderbar in Abhängigkeit von der Bildschirmgröße Festlegen. Ich würde die Elemente aber gerne auch in Abhängigkeit von der Bildschirmgröße positionieren. Solange .position() hier auskommentiert bleibt, hat der Button die vorgesehene Größe. Sobald ich das Kommentarzeichen entferne, bekommt der Button plötzlich die Größe nahezu des ganzen Bildschirms - nun dachte ich, dass .position nicht mit der Größe zu tun hätte? Oder ist diese Methode vielleicht mit dem Geometry Reader nicht wirklich kompatibel?
  • flori-software schrieb:

    Größe. Sobald ich das Kommentarzeichen entferne, bekommt der Button plötzlich die Größe nahezu des ganzen Bildschirms
    Nein, nicht der Button wird so groß, sondern der Background. Das merkst du daran, dass der Button nur im Bereich des Texts auch auf Klicks reagiert.
    In SwiftUI spielt die Reihenfolge der Modifier eine wichtige Rolle. Setze den .position Modifier mal hinter den .padding Modifier.