我正在学习苹果提供的“开始开发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/

10-13 04:28