2016-07-01 8 views
0

Ich befolge derzeit dieses Apples iOS Swift Tutorial für Anfänger, die erklären, wie man die Bewertung Sternansicht erstellen und ich verstehe nicht etwas über den Layout-Code. Um Layout die Bewertung Schaltflächen sie von Code erstellt mit einer for-in-Schleife, schaffen sie eine andere Methode:Apple Swift Tutorial: Bewertungsschaltflächen Layout

override func layoutSubviews() { 
    var buttonFrame = CGRect(x: 0, y: 0, width: 44, height: 44) 

    // Offset each button's origin by the length of the button plus spacing. 
    for (index, button) in ratingButtons.enumerate() { 
     buttonFrame.origin.x = CGFloat(index * (44 + 5)) 
     button.frame = buttonFrame 
    } 
} 

Aber bei der Initialisierung der Tasten:

for _ in 0..<5 { 
     let button = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44)) 
     button.backgroundColor = UIColor.redColor() 
     // Add event listener 
     button.addTarget(self, action: #selector(RatingControl.rateButtonTapped(_:)), forControlEvents: .TouchDown) 
     ratingButtons += [button] 

     addSubview(button) 
    } 

kann nicht einfach passen sie die Code, und verwenden Sie einen Platzhalter (_) in der For-in-Schleife, verwenden Sie einen Index und tun Sie so etwas? :

for i in 0..<5 { 
     let button = UIButton(frame: CGRect(x: (i * 49), y: 0, width: 44, height: 44)) 
     button.backgroundColor = UIColor.redColor() 
     // Add event listener 
     button.addTarget(self, action: #selector(RatingControl.rateButtonTapped(_:)), forControlEvents: .TouchDown) 
     ratingButtons += [button] 

     addSubview(button) 
    } 

ich Swift lerne, und ich verstehe nicht, warum sie das layoutSubviews Methode anstatt das zu tun, dass bei der Initialisierung außer Kraft setzen. Sag mir, welcher Weg ist der Reiniger bitte. Hier ist das Tutorial Link: https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson5.html

Grüße,

Antwort

0

Das Problem ist, dass der Rahmen für die enthaltende rect nicht bekannt ist, bevor die viewWillLayoutSubviews Methode aufgerufen wird. Die Methode layoutSubviews wird nach dieser Methode aufgerufen, und jedes Mal wird layoutIfNeeded für die Ansicht aufgerufen.

Dies bedeutet, dass das Layout an Aktualisierungen in der Ansicht angepasst und nur von einer Methode aufgerufen werden kann.

Ob eine Methode ist sauberer als eine andere ist subjektiv, und wirklich bis zu jedem einzelnen zu bestimmen, aber zumindest sollten Sie Ihren UI-Code in einer Weise schreiben, die den Lebenszyklus der Ansicht folgt.