在 swift 中为按钮添加约束(Apple iOS 教程)

Posted

技术标签:

【中文标题】在 swift 中为按钮添加约束(Apple iOS 教程)【英文标题】:Add constraints to button in swift (Apple iOS Tutorial) 【发布时间】:2016-12-24 21:04:40 【问题描述】:

我正在为 ios 开发编写 Apples Tutorial(章节:“将按钮添加到视图”)。只需复制以下代码,我就会得到不同的结果:

import UIKit

@IBDesignable class RatingControl: UIStackView 

//MARK: Properties
private var ratingButtons = [UIButton]()

var rating = 0
@IBInspectable var starSize: CGSize = CGSize(width: 44.0, height: 44.0)
@IBInspectable var starCount: Int = 5

//MARK: Initialisation
override init(frame: CGRect) 
    super.init(frame: frame)
    setupButtons()

required init(coder: NSCoder) 
    super.init(coder: coder)
    setupButtons()


//MARK: Private Methods
private func setupButtons() 

        // Create the button
        let button = UIButton()
        button.backgroundColor = UIColor.red

        // Add constraints
        button.translatesAutoresizingMaskIntoConstraints = false
        button.heightAnchor.constraint(equalToConstant: starSize.height).isActive = true
        button.widthAnchor.constraint(equalToConstant: starSize.width).isActive = true

        // Setup the button action
        button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(button:)), for: .touchUpInside)

        // Add the button to the stack
        addArrangedSubview(button)

        // Add the new button to the rating button array
        ratingButtons.append(button)


//MARK: Button Action
func ratingButtonTapped(button: UIButton) 
    print("Button pressed ????")

约束似乎不起作用。我的红色按钮的大小与其超级堆栈视图完全相同。它不限于 44x44。

控制台报告不能同时满足所有约束:

      2016-12-25 18:43:02.375251 FoodTracker[13644:1695258] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x600000092160 UIButton:0x7ff15f40a740.width == 44   (active)>",
    "<NSLayoutConstraint:0x608000095a90 'UISV-canvas-connection' FoodTracker.RatingControl:0x7ff15f6116c0.leading == UIButton:0x7ff15f40a740.leading   (active)>",
    "<NSLayoutConstraint:0x608000095b30 'UISV-canvas-connection' H:[UIButton:0x7ff15f40a740]-(0)-|   (active, names: '|':FoodTracker.RatingControl:0x7ff15f6116c0 )>",
    "<NSLayoutConstraint:0x608000095630 'UIView-Encapsulated-Layout-Width' FoodTracker.RatingControl:0x7ff15f6116c0.width == 200   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000092160 UIButton:0x7ff15f40a740.width == 44   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2016-12-25 18:43:02.376266 FoodTracker[13644:1695258] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x600000091e90 UIButton:0x7ff15f40a740.height == 44   (active)>",
    "<NSLayoutConstraint:0x608000095b80 'UISV-canvas-connection' FoodTracker.RatingControl:0x7ff15f6116c0.top == UIButton:0x7ff15f40a740.top   (active)>",
    "<NSLayoutConstraint:0x608000095c70 'UISV-canvas-connection' V:[UIButton:0x7ff15f40a740]-(0)-|   (active, names: '|':FoodTracker.RatingControl:0x7ff15f6116c0 )>",
    "<NSLayoutConstraint:0x608000095680 'UIView-Encapsulated-Layout-Height' FoodTracker.RatingControl:0x7ff15f6116c0.height == 110   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000091e90 UIButton:0x7ff15f40a740.height == 44   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

但是,我没有为堆栈视图定义其他约束,除了上面类中的约束。同样在 Interface Builder 中,大纲中的堆栈视图没有其他约束。 'UISV-canvas-connection' 来自哪里?

【问题讨论】:

为什么不在storyboard或xib中定义这个? 我只是想像教程一样尝试,但不知道为什么会发生不同的事情。 你能显示你的整个按钮代码吗?你是否使用调试器? 我还没有真正使用过。两天前我才开始开发 iOS。我刚刚添加了控制台输出,它说要添加一个符号断点。但是我得到的指针地址并没有告诉我太多。 谢谢!我发现我做的不同:我没有将水平堆栈视图添加到垂直 SV,而是在下面。现在,当我纠正它时,一切正常。但我仍然不明白额外的约束来自哪里以及如何禁用它们。如果我没有在我的代码中加入约束,我在哪里可以找到它们? 【参考方案1】:

在使用 Apple 的教程时发现了同样的问题,并且确实犯了在 Vertical Stack View 之外创建 Horizo​​ntal Stack View 的错误。

将它拖回垂直堆栈视图后,它对我有用:)

【讨论】:

你能解释一下为什么吗? 我也很想了解为什么这会有所作为 完美。我自己也在寻找解决方案。很高兴有人已经发现了。在手册中它告诉In your storyboard, use the Object library to find a Horizontal Stack View object, and drag one into your storyboard scene so that it’s "in the stack view" below the image view.

以上是关于在 swift 中为按钮添加约束(Apple iOS 教程)的主要内容,如果未能解决你的问题,请参考以下文章

将按钮绑定到视图的右上角 iOS swift

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

如何在 Swift 的警报中为按钮添加操作

Swift iOS以编程方式在导航栏下方设置scrollView约束

在 iOS 中为 UIPageControl 添加约束时 UIScrollView 不滚动

如何使用 PKAddPassButton 添加“添加到 Apple Wallet”按钮 - swift