我正在学习苹果提供的“开始开发iOS应用程序”教程,在Implement a Custom Control部分遇到了问题。我想尽一切办法让这个按钮把东西打印到控制台上,但没办法让它工作。我在教程“向视图添加按钮”的一节中,大约是页面向下的五分之一。
其他一切都很好。
我已设置RatingControl.swift文件如下:
import UIKit
class RatingControl: UIView {
// MARK: Initialisation
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// Create a square button
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44))
// Set the background colour of the button
button.backgroundColor = UIColor.darkGray
button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(_:)), for: .touchDown)
// Add the button to the view
addSubview(button)
}
// MARK: Button Action
func ratingButtonTapped(_: UIButton) {
print("Button pressed")
}
}
有一些事情与教程略有不同,但那是因为Xcode说事情已经改变了。
在Main.storyboard文件中,我使用RatingControl类添加了一个视图。按钮显示,但当我单击它时什么也不会发生。
任何帮助都将不胜感激。如果需要任何额外的信息,请告诉我。
最佳答案
这个故事实际上有三个层次:
堆栈视图(原始问题中未提及)
分级控制
按钮
好吧,stack视图是一个复杂的控件,它的工作涉及很多巫术,并且受限于其排列的子视图,它正在将RatingControl的大小减小到零。因此,该按钮超出了RatingControl的范围(通过给RatingControl一个背景色很容易证明——背景色不会出现)。RatingControl不会剪裁到它的边界,因此按钮仍然可见-但是,由于超出了它的超视图范围,它是不可点击的。
至于stack视图为什么要将RatingControl的大小减小到零:这是因为RatingControl没有intrisicContentSize
。我们需要这样做的原因很复杂,这与堆栈视图如何操作其排列的子视图并为它们提供约束有关。但本质上,它根据一个排列视图的intrinsicContentSize
做出很多决定。
你在评论中说:
在大小检查器中,它的内部大小设置为占位符,宽度240,高度44。或者我需要做些什么来阻止堆栈视图变为零大小?
这里要理解的关键是,大小检查器中的设置只是一个占位符。只是把故事板关起来,免得它抱怨。它实际上在运行时没有给视图任何内部大小。为此,必须实际重写代码中的intrinsicContentSize
property,作为返回实际大小的计算变量。
关于swift - Apple iOS教程:使UIButton addTarget正常工作的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40944037/