2015-05-12 13 views
7

Ich versuche, eine globale Funktion zu schreiben, die einen activityIndicator zu jeder Ansicht (meist imageViews) durch Aufruf einer solchen Funktion hinzufügt.Holen Sie sich das Zentrum eines UIView in Swift

public func addActivityIndicatorToView(activityIndicator: UIActivityIndicatorView, view: UIView){ 

    //activityIndicator configuration ... 
    activityIndicator.center = view.center 
    view.addSubview(activityIndicator) 
    activityIndicator.startAnimating() 
} 

Aber ich die Mitte der Ansicht nicht aus irgendeinem Grunde erhalten:

Die Funktion hat ich jetzt aus gemacht.

Ich habe auch verschiedene Lösungen rund um SO und Google ausprobiert, aber bisher hat keiner funktioniert.

Gibt es eine Möglichkeit, den Mittelpunkt zu erhalten und den activityIndicator auf eine beliebige UIView zu setzen?

+0

Falls keine der Lösungen in @EmilioPelaez Antwort Arbeit, würde ich vorschlagen, die Größe Ihrer Ansicht überprüfen. Bei welcher Methode setzen Sie den Mittelpunkt des Aktivitätsindikators? – ABakerSmith

+0

In einer globalen Klasse, die alle über das Projekt freigegebenen Methoden enthält – Phillip

+0

Sie könnten die Position des 'activityIndicator' festlegen, bevor der Rahmen der Ansicht korrekt eingerichtet wurde (z. B. in' viewDidLoad') ... – ABakerSmith

Antwort

11

ich Ihr Problem (siehe mein Kommentar) leicht zu reproduzieren hatte. Ich denke, es könnte ein Problem des automatischen Layouts sein. Kann es sein, dass Sie stattdessen Constraints verwenden können, um die Position zu berechnen?

func addActivityIndicatorToView(activityIndicator: UIActivityIndicatorView, view: UIView){ 

    self.view.addSubview(activityIndicator) 

    //Don't forget this line 
    activityIndicator.setTranslatesAutoresizingMaskIntoConstraints(false) 
    view.addConstraint(NSLayoutConstraint(item: activityIndicator, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)) 
    view.addConstraint(NSLayoutConstraint(item: activityIndicator, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0)) 


    activityIndicator.startAnimating() 


} 

Hoffnung, die helfen könnte.

+0

Großartig! Danke an Ihren Kommentar und dieses erstaunliche Stück Code. Es funktioniert jetzt gut. – Phillip

+0

Erstaunliche Antwort !!! Es funktioniert für Ich auch –

+0

Es ist definitiv mehr universelle Lösung als andere, die View.center verwenden – dorsz

5

Die Eigenschaft center ist relativ zur Superansicht einer Ansicht. Wenn also der Rahmen Ihrer Ansicht {10, 10, 20, 20} ist, wird center{20, 20} sein.

Ich vermute, Sie möchten die activityIndicator in view zentrieren.

können Sie

tun
activityIndicator.center = CGPointMake(view.width/2, view.height/2) 
+0

Ich habe das schon versucht, und das geht leider in der unteren rechten Ecke der Superview :( – Phillip

7

Swift 3:

activityIndicator.center = CGPoint(x: view.height/2, y: view.width/2) 

oder können Sie versuchen:

activityIndicator.center = view.center 
Verwandte Themen