2016-10-09 4 views
0

Ich versuche eine Swift-Funktion zu verwenden, um einen Kreis in der Mitte einer Ansicht zu platzieren, so dass er unabhängig von der Bildschirmgröße immer in der Mitte liegt. Ich kann den Kreis an einem Punkt zeichnen, der durch eine Menge beliebiger x- und y-Werte definiert ist, aber ich brauche die Funktion, um stattdessen diese Werte zu liefern.Wie verwende ich die von der Swift-Funktion zurückgegebenen Werte

Ich habe eine Funktion namens screenCentre() erstellt, um zwei Parameter zu lesen und zurückzugeben, die die Mittelpunktkoordinaten sind. Xcode warnt jedoch, dass die

“Result of call to screenCentre() is unused”

ich durch Swift tutorials on functions and closures gearbeitet haben und verstehen, wie Argumente an eine Funktion zu übergeben, aber ich bin immer noch nicht klar, wie die von dieser Funktion zurückgegebenen Werte verwenden.

Hier ist mein Code:

import UIKit 

class ViewController: UIViewController { 

    let radius = CGFloat(20) 
    let fillColour = UIColor.clear.cgColor 
    let lineColour = UIColor.red.cgColor 
    let lineWidth = 1.0 

    var x: CGFloat? 
    var y: CGFloat? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     screenCentre() 
     print(screenCentre()) 

     // arbitrary set of coordinates used to draw circle 

     circle(x: 150, y: 170) 

    } 

    func screenCentre() -> (x: CGFloat, y: CGFloat) 
    { 
     return (self.view.bounds.size.width/2, self.view.bounds.size.height/2) 
    } 

    func circle(x: CGFloat, y: CGFloat) { 
     let circlePath = UIBezierPath(arcCenter: CGPoint(x: x,y: y), radius: radius, startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true) 

     let shapeLayer   = CAShapeLayer() 
     shapeLayer.path   = circlePath.cgPath 

     shapeLayer.fillColor = fillColour 
     shapeLayer.strokeColor = lineColour 
     shapeLayer.lineWidth = CGFloat(lineWidth) 

     view.layer.addSublayer(shapeLayer) 
    } 
} 

UPDATE

Durch eine konstante erklärte ich bin in der Lage durch diese Funktion zurückgegebenen Werte zu verwenden. Sam_M und Kevin Bunarjo beantworten die Frage wie gefragt.

Daniel T und PEEJWEEJ identifizierten jedoch beide ein verwandtes Problem, das ich nicht erkannt hatte. Sobald ich Fixits angewendet habe, bietet mir die von Daniel T angebotene Erweiterungslösung nun die Möglichkeit, den Bildschirm um die Mitte zu drehen. Also habe ich es als die beste Antwort markiert. Danke an alle, die dazu beigetragen haben.

Hier ist der aktualisierte Code.

Antwort

2

Ihre screenCentre() Funktion wird nicht in viewDidLoad arbeiten, weil die view ist noch nicht auf den Bildschirm so bemessen, daher sein Zentrum in der Mitte des Bildschirms nicht.

Verwenden Sie stattdessen:

func screenCentre() -> CGPoint { 
    return CGPoint(x: UIScreen.mainScreen().bounds.midX, y: UIScreen.mainScreen().bounds.midY) 
} 

Bitte beachte, dass ich einen CGPoint anstelle eines Tupels verwende, aber die Wirkung ist die gleiche. Außerdem muss die obige Funktion nicht in Ihrem View-Controller oder einer anderen Klasse enthalten sein, da sie nicht auf self verweist.Es kann eine globale Funktion sein.

Da Swift Artrichtlinien Herstellungsverfahren über globale Funktionen fördern, Sie könnten es vorziehen, die Funktion in einer Erweiterung wie folgt zu setzen:

extension UIScreen { 
    var centre: CGPoint { 
     return CGPoint(x: bounds.midX, y: bounds.midY) 
    } 
} 

die wie folgt genannt werden können:

let centre = UIScreen.mainScreen().centre 
print(centre) 
+0

danke. Siehe meine Bearbeitung – Greg

+0

Wenn es mehrere Ansichten gibt, die Kreise benötigen, machen Sie sie zu allen Unterklassen Ihrer Kreisansicht oder fügen Sie jedem eine Kreisansicht hinzu. – PeejWeej

1

In Ihrer ViewDidLoad-Methode rufen Sie nur die Methode auf, aber nicht die zurückgegebenen Werte. Alles, was Sie tun müssen, um dies zu beheben, ist eine Variable zu erstellen und sie dem Aufruf Ihrer Funktion zuzuordnen.

Beispiel:

let center = screenCentre() 
print(center) 

Nun wird die variable Zentrum die Koordinaten des Bildschirms Zentrum enthalten. Und im nachfolgenden Code können Sie center wie bei jeder anderen Variable verwenden.

+0

Dank. Siehe meine Bearbeitung – Greg

0

Eine Sache, die Sie tun können, ist die Verwendung des _, um den Rückgabewert von der Funktion zu verwerfen, wenn Sie den Rückgabewert nicht benötigen.

let _ = screenCentre() 
+1

Sie haben ein '=' verpasst. Außerdem ist diese Lösung völlig korrekt, macht aber keinen Sinn, wenn die Funktion nicht mutiert, wie dies bei der 'screenCentre'-Funktion nicht der Fall ist. – Connor

1

Ihre screenCenter Funktion gibt ein Tupel mit zwei CGFloat Werte. Diese Werte sind mit x und y gekennzeichnet, sodass Sie beim Abfragen des Rückgabewerts der Funktion anhand ihres Namens darauf zugreifen können.

override func viewDidLoad() { 
    super.viewDidLoad() 

    let center = screenCentre() 
    //center.x contains the x value returned from screenCenter 
    //center.y contains the y value returned from screenCenter 

    circle(x: center.x , y: center.y) 
} 
+0

danke. Siehe meine Bearbeitung – Greg

0

Erste von allen, UIViews have a center attribute, so müssen Sie es nicht berechnen.

Zweitens kann das Verhalten inkonsistent sein, wenn es mit viewDidLoad geändert wird, und wird nicht auf Änderungen der Größe/Rotation reagieren.

Ich würde empfehlen, eine Unterklasse von UIView zu machen, die den Kreis und etwas zu tun, wie diese verwaltet Zeichnung:

class ViewController: UIViewController { 

    var circle: CircleView? 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     centerCircle() 
    } 

    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 
     centerCircle() 
    } 

    func centerCircle() { 
     circle?.center = self.view.center 
    } 
} 
+0

danke. Siehe meine Bearbeitung. Ich versuche immer noch diesen Ansatz, da ich mehrere UIViews habe, die Kreise benötigen. – Greg

+0

Ich habe schließlich herausgefunden, wie man eine Unterklasse von UIView erstellt und eine neue Frage hat [http://stackoverflow.com/questions/40059009/why-does-uiview-not-stay-on-centre-while-it-rotates] – Greg

+0

Ich habe schließlich eine Unterklasse von UIView erstellt, die in einem Kreis angeordnete Schaltflächen zeichnet und es funktioniert fast [siehe http://stackoverflow.com/questions/40558939/how-do-irotate-a-group-of-buttons-programmatically -in-swift]. – Greg

Verwandte Themen