2017-05-14 2 views
1

Ok, das scheint mehr als alles andere ein mathematisches Problem zu sein - ich möchte eine bestimmte Anzahl von gleich verteilten Subviews (keine eingestellte Lücke) über eine horizontale Distanz erzeugen. Ich möchte einen Rand auf jeder Seite festlegen und verteilt die Ansichten gleichmäßig über den verbleibenden Platz. Das ist, was ich habe:Swift: Programmatisch gleiche Ansichten über eine Entfernung?

func spawnNodes(num: Int, margin: CGFloat) 
    { 
     let width = self.bounds.width - 2*margin 
     let length = Int(width)/num //20 
     var lastPos = margin 

     for i in 1...num { 
      let n = Node(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) 

      n.center = CGPoint(x: margin+(CGFloat(i*length)/2), y: self.bounds.height*0.2) 
      lastPos = n.center.x 
      self.addSubview(n) 
     } 

Und das gleich verteilt, aber sie nehmen den ganzen Raum nicht auf: enter image description here

Was stimmt hier nicht? Wie kann ich auf jeder Seite einen Abstand halten und die Ansichten gleichmäßig verteilen?

TAKE 2:

for i in 1...num { 
      let n = Node(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) 
      let space = (width - CGFloat(num)*n.bounds.width)/CGFloat(num-1) 

      n.center = CGPoint(x: lastPos+space+n.bounds.width+(CGFloat(i*length)/2), y: self.bounds.height*0.2) 
      lastPos = n.center.x 
      self.addSubview(n) 
     } 
+0

Nicht berechnen 'length' - berechnen den Abstand. Sie haben 'n-1' Leerzeichen zwischen' n' Objekten. 'spacing = (Breite - n * Objektbreite)/(n-1)'. Erhöhen Sie nun 'lastPos' um' spacing + objectWidth' – Paulw11

+0

Können Sie das als Beispiel schreiben? – skyguy

+0

Ok. In der obigen Bearbeitung habe ich versucht, Ihrem Rat zu folgen, aber es hat nicht funktioniert. Ich schätze es, wenn Sie eine Antwort – skyguy

Antwort

1

einen UIStackView Gebrauch. Es macht das trivial einfach.

0

Es ist nur ein mathematisches Problem. Ihr erster Versuch war fast da, hat aber eine leichte Fehlkalkulation der x-Koordinate.

Es mußte sein: margin + (i-1) * Länge

n.center = CGPoint(x: margin+CGFloat((i-1)*length)), y: self.bounds.height*0.2) 
2

Hier meine Vorschläge sind es einfach zu machen und klar zu implementieren:

  1. Verwenden Breite des Knotens Berechnungen in
  2. berechnet Position der linken Knotenseite anstelle der Mitte
  3. berechnen Position jeden Knotens unabhängig (nicht verwenden lastPos)
  4. Falls Sie genug Platz, um alle Knoten zu platzieren, berechnen padding, die für einen Knoten
  5. Andernfalls (padding < 0) berechnen, was Teil jedes Knotens ohne Overlay angezeigt werden können zur Verfügung zusätzlichen Platz ist. Verwenden Sie die Tatsache der letzte Knoten nie
  6. überlagert wird

Bedenkt man, dass die Umsetzung aussehen könnte:

func spawnNodes(num: Int, margin: CGFloat) { 
    let width = self.bounds.width - 2 * margin 
    let nodeWidth : CGFloat = 50 
    var availableWidth = width/CGFloat(num) 

    var padding = (availableWidth - nodeWidth)/2 
    if padding < 0 { 
     padding = 0 
     availableWidth = (width - nodeWidth)/CGFloat(num - 1) 
    } 

    padding += margin 
    let y = self.bounds.height * 0.2 
    for i in 0 ..< num { 
     let x = CGFloat(i) * availableWidth + padding 
     let n = Node(frame: CGRect(x: x, y: y, width: nodeWidth, height: 50)) 
     self.addSubview(n) 
    } 
} 
Verwandte Themen