2017-01-02 1 views
0

In meinem Code möchte ich die UIButton in der Mitte des Bildschirms starten, dann, nachdem ich darauf geklickt habe, möchte ich es auf eine zufällige verschieben Position auf dem Bildschirm. Also habe ich den Code dafür in eine zufällige Position gebracht, nachdem ich ihn angeklickt habe, obwohl das Problem ist, dass er in einer zufälligen Position beginnt, anstatt in der Mitte zu beginnen. Hier ist der Code für meine ViewController.swift:Mein UIButton beginnt an einer zufälligen Position statt in der Mitte zu starten und bewegt sich

class ViewController: UIViewController { 
@IBOutlet weak var btn: UIButton! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    btn.layer.cornerRadius = 10 
    btn.layer.position = CGPoint(x: self.view.center.x, y: self.view.center.y) 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
@IBAction func tapRandomBTN(_ sender: Any) { 
    let buttonWidth = btn.frame.width 
    let buttonHeight = btn.frame.height 

    // Find the width and height of the enclosing view 
    let viewWidth = btn.superview!.bounds.width 
    let viewHeight = btn.superview!.bounds.height 

    // Compute width and height of the area to contain the button's center 
    let xwidth = viewWidth - buttonWidth 
    let yheight = viewHeight - buttonHeight 

    // Generate a random x and y offset 
    let xoffset = CGFloat(arc4random_uniform(UInt32(xwidth))) 
    let yoffset = CGFloat(arc4random_uniform(UInt32(yheight))) 

    // Offset the button's center by the random offsets. 
    btn.center.x = xoffset + buttonWidth/2 
    btn.center.y = yoffset + buttonHeight/2 

} 

}

+1

in 'viewDidLoad' gibt es keine Layout-Informationen vorhanden, also alles ... wird nicht umrahmen, Position, Lage, in der Mitte, im Zusammenhang/definiert/random. Versuchen Sie 'viewDidLayoutSubviews' z. – luk2302

Antwort

1

Da @ luk2302 in seinem Kommentar darauf hinweist, kann man sich nicht darauf verlassen, dass in viewDidLoad View-Frames korrekt sind. Sie müssen diese Logik in viewDidLayoutSubviews verschieben.

Beachten Sie jedoch, dass, wenn irgendetwas dazu führt, dass das System viewDidLayoutSubviews aufruft, Ihre Schaltfläche an der ursprünglichen Position zurückspringt.

Wenn Sie möchten, dass es in seiner randomisierten Position bleibt, sobald es dorthin verschoben wird, sollten Sie eine "wasRandomized" boolesche Instanzvariable hinzufügen und die Logik in viewDidLayoutSubviews die Schaltfläche nur in die Mitte verschieben, wenn Sie sie nicht randomisiert haben bereits.

Beachten Sie auch, dass Sie Layout-Einschränkungen wirklich verwenden sollten. Erstellen Sie eine Layouteinschränkung für die x-Position und eine weitere für y und ändern Sie ihre konstanten Werte, wenn Sie die Schaltfläche verschieben möchten. Auf diese Weise wird das automatische Layout Ihre Position nicht unter Ihnen verändern.

0

Scheint, wie Sie die UIButton in der Storyboard haben. Um die UIButton bei cneter starten, stellen Sie die Layoutbeschränkungen des UIButton in Storyboard als

  1. horizontal in Containern
  2. vertikal in Behälter
  3. konstante Breite und Höhe

Auch den Code in viewDidLoad

btn.layer.position = CGPoint(x: self.view.center.x, y: self.view.center.y) 

ist nicht erforderlich.

0

Sie sollten wirklich Einschränkungen verwenden. Wenn Sie sie nicht verwenden, weil Sie nicht in Storyboards arbeiten möchten, gibt es eine Möglichkeit, sie programmatisch zu setzen. Es erfordert jedoch ein wenig Einstellung

WICHTIG: Apple möchte nicht, dass Sie diese Methode verwenden, aber ich fand diese Weise hilfreich beim Verständnis von Einschränkungen und machte den Übergang zur Verwendung von Storyboards viel einfacher. Hier ist ein Video-Guide, wenn Sie interessiert sind. https://www.youtube.com/watch?v=lWSc0wHFTXM&t=6s

//example of programatic constraints (swift3): 

button.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: randomX).isActive = true 
button.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: randomY).isActive = true 
button.widthAnchor.constraint(equalToConstant: 55.0).isActive = true 
button.heightAnchor.constraint(equalToConstant: 55.0).isActive = true 
+0

Ich habe bereits die Antwort, die ich brauchte – krish

Verwandte Themen