我的UIButton以随机位置开始,而不是从中心开始并移动

时间:2017-01-02 15:50:31

标签: ios swift uibutton swift3

在我的代码中,我希望UIButton从屏幕中心开始,然后在我点击它之后,我希望它移动到屏幕上的随机位置。所以当我点击它后,我把它的代码放到一个随机位置,虽然问题是它是以随机位置开始而不是从中心开始。这是我的ViewController.swift的代码:

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

}

}

3 个答案:

答案 0 :(得分:1)

正如@ luk2302在评论中指出的那样,你不能依赖viewDidLoad中的视图帧是正确的。您需要将该逻辑移至viewDidLayoutSubviews。

但请注意,如果有任何原因导致系统调用viewDidLayoutSubviews,则按钮将快速恢复到原始位置。

如果你希望它移动到它的随机位置,你应该添加一个“wasRandomized”布尔实例变量,并使viewDidLayoutSubviews中的逻辑仅将按钮移动到中心如果你还没有随机化它

另请注意,您应该使用布局约束。为x位置创建布局约束,为y创建另一个布局约束,并在要移动按钮时修改其常量值。这样,自动布局不会将您的按钮位置从您的下方移开。

答案 1 :(得分:0)

好像你在Storyboard中有UI按钮。要使UIButton从cneter开始,请将故事板中UIButton的布局约束设置为

  1. 水平放入容器
  2. 垂直放入容器
  3. 恒定宽度和高度
  4. viewDidLoad中的代码

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

    不是必需的。

答案 2 :(得分:0)

你真的应该使用约束。如果您不使用它们,因为您不想在故事板中工作,则可以通过编程方式设置它们。它确实需要一点安置

重要提示:Apple不希望您使用此方法,但我发现这种方式有助于理解约束,并且更容易转换为使用故事板。如果您有兴趣,这是一个视频指南。 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