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

Posted

技术标签:

【中文标题】我的 UIButton 从随机位置开始,而不是从中心开始并移动【英文标题】:My UIButton is starting in a random position instead of starting in the center and moving 【发布时间】:2017-01-02 15:50:31 【问题描述】:

在我的代码中,我希望 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


【问题讨论】:

viewDidLoad 中没有布局信息,因此与框架、位置、位置、中心...相关的所有内容都没有设置/定义/随机。试试viewDidLayoutSubviews 例如 【参考方案1】:

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

但是,请注意,如果有任何事情导致系统调用 viewDidLayoutSubviews,您的按钮将快速回到原来的位置。

如果您希望它在移动后保持在其随机位置,您应该添加一个“wasRandomized”布尔实例变量,并使 viewDidLayoutSubviews 中的逻辑仅在您尚未随机化时将按钮移动到中心.

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

【讨论】:

【参考方案2】:

好像你在 Storyboard 中有 UIbutton。要使 UIButton 从 cneter 开始,请将 Storyboard 中 UIButton 的布局约束设置为

    水平放置在容器中 垂直放置在容器中 恒定的宽度和高度

还有viewDidLoad中的代码

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

不是必需的。

【讨论】:

【参考方案3】:

你真的应该使用约束。如果您因为不想在情节提要中工作而没有使用它们,那么有一种方法可以以编程方式设置它们。不过它确实需要一些设置

重要提示: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

【讨论】:

以上是关于我的 UIButton 从随机位置开始,而不是从中心开始并移动的主要内容,如果未能解决你的问题,请参考以下文章

从 UIButton 而不是 UIBarButtonItem 显示 WEPopover

iOS 7 - 如何拖动按钮或 UIView 的快照而不是按钮本身

如何为 UIButton 设置自定义渐变背景?

如何随机放置 UIButton 和值

C++:当我的应用程序在随机位置崩溃时从哪里开始?

2 行文本 UIButton