以编程方式使用约束 Swift 移动按钮

Posted

技术标签:

【中文标题】以编程方式使用约束 Swift 移动按钮【英文标题】:Move the button using the Constraint Swift Programmatically 【发布时间】:2021-03-16 14:17:44 【问题描述】:
@objc func buttonRoundPlayer()
    
    view?.addSubview(buttonRound)
    
    buttonRound.setTitle("Jump", for: .normal)
    buttonRound.addTarget(self, action: #selector(roundhandle), for: .touchUpInside)
    buttonRound.backgroundColor = .red
    buttonRound.layer.cornerRadius = 5
    buttonRound.layer.borderWidth = 1
    buttonRound.layer.borderColor = UIColor.white.cgColor
    
    buttonRound.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([buttonRound.bottomAnchor.constraint(equalTo:        view!.bottomAnchor),buttonRound.bottomAnchor.constraint(equalTo: view!.bottomAnchor),buttonRound.widthAnchor.constraint(equalToConstant: 100),buttonRound.heightAnchor.constraint(equalToConstant:50)])
    

我最近设法在理解按钮布局并使其工作方面获得帮助,但我不知道如何调整约束以将按钮从屏幕底部边缘移开。

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

不知道底边的边缘是什么意思,如果你说的是安全区域布局指南,那么你可以使用

        NSLayoutConstraint.activate([buttonRound.bottomAnchor.constraint(equalTo:view!.safeAreaLayoutGuide.bottomAnchor),
                                     buttonRound.widthAnchor.constraint(equalToConstant: 100),
                                     buttonRound.heightAnchor.constraint(equalToConstant:50)])

代码中的几个问题,

    你已经应用了两次相同的约束,这对我来说没有逻辑意义
    buttonRound.bottomAnchor.constraint(equalTo: view!.bottomAnchor),
    buttonRound.bottomAnchor.constraint(equalTo: view!.bottomAnchor)

    您使用view! 强制展开视图我不确定它是否是 ViewController 的视图,如果它是 ViewController 的视图,您不需要强制展开它,因为它本质上是一个隐含的可选,所以您应该能够改为view.safeAreaLayoutGuide

    通过代码访问视图,就好像它是可选的一样,使用 view?.addSubview(buttonRound)view!.bottomAnchor 之类的语句,因为我不确定它是哪个视图,如果你确定它是可选的,我建议使用带有 @ 的安全展开987654327@, guard let 而不是 !

if let view = view 
            view.addSubview(buttonRound)

            buttonRound.setTitle("Jump", for: .normal)
            buttonRound.addTarget(self, action: #selector(roundhandle), for: .touchUpInside)
            buttonRound.backgroundColor = .red
            buttonRound.layer.cornerRadius = 5
            buttonRound.layer.borderWidth = 1
            buttonRound.layer.borderColor = UIColor.white.cgColor

            buttonRound.translatesAutoresizingMaskIntoConstraints = false

            NSLayoutConstraint.activate([buttonRound.bottomAnchor.constraint(equalTo:view.safeAreaLayoutGuide.bottomAnchor),
                                         buttonRound.widthAnchor.constraint(equalToConstant: 100),
                                         buttonRound.heightAnchor.constraint(equalToConstant:50)])
        

编辑:正如下面 OP 所评论的,他看到了错误

“SafeAreLayoutGude”仅适用于 ios 11.0 或更新版本

OP 必须使用低于 iOS 11 的部署目标,并且由于 OP 没有在评论中回复我的问题,我正在更新答案以支持低于 iOS 11.0

        if let view = view 
            view.addSubview(buttonRound)

            buttonRound.setTitle("Jump", for: .normal)
            buttonRound.addTarget(self, action: #selector(roundhandle), for: .touchUpInside)
            buttonRound.backgroundColor = .red
            buttonRound.layer.cornerRadius = 5
            buttonRound.layer.borderWidth = 1
            buttonRound.layer.borderColor = UIColor.white.cgColor

            buttonRound.translatesAutoresizingMaskIntoConstraints = false

            NSLayoutConstraint.activate([buttonRound.widthAnchor.constraint(equalToConstant: 100),
                                         buttonRound.heightAnchor.constraint(equalToConstant:50)])
            if #available(iOS 11.0, *) 
                buttonRound.bottomAnchor.constraint(equalTo:view.safeAreaLayoutGuide.bottomAnchor).isActive = true
            
            else 
                buttonRound.bottomAnchor.constraint(equalTo:view.bottomAnchor).isActive = true
            
        

不太确定您正在构建/维护哪种应用程序,iOS 11 对我来说似乎太旧了,检查您是否真的需要支持这么旧的 iOS 版本,将项目设置中的 iOS 部署目标值更改为避免这样的多个兼容问题。

【讨论】:

@OptiCode22 :嘿,它有用吗?你还遇到什么问题吗 嘿,我尝试添加代码,但我得到的只是 iOS 11 上可用的代码,而且代码无法运行。代码不是在视图控制器中编写的,而是在游戏场景类中编写的 @opticode22:你的部署目标是什么? @opticode22 :我已经更新了我的答案,请检查,还将您的部署目标值更改为 xcode 中的相关值,您不需要支持所有 iOS 版本,只是因为可以,检查您的用户群的百分比是多少低于 iOS 11 并决定 嘿,Sandeep,谢谢你,我会用你提供给我的代码更新代码,如果问题得到解决,我会更新你

以上是关于以编程方式使用约束 Swift 移动按钮的主要内容,如果未能解决你的问题,请参考以下文章

StackView 中的按钮约束(以 Swift 编程方式)

以编程方式向 Swift 中的视图添加约束时出错

(Swift) 以编程方式将 UIButton 约束到角落

如何在不制作 IBOutlet 的情况下以编程方式在 Swift 中为 UIView 高度约束设置动画?

当用户以编程方式单击swift ios中的删除按钮时,如何将光标从一个文本字段自动移动到另一个文本字段?

如何在 Swift 中以编程方式在水平线上设置约束? [关闭]