将子视图添加到自定义UI按钮类

时间:2017-10-28 11:46:55

标签: ios swift

目的:

  

当用户点击自定义按钮时,应该会出现一个空白的UIView,覆盖按钮。

我已将我的代码添加到一个新的Swift项目中,看起来像这样

import UIKit

class DownloadUIButton: UIButton {
    var isDownloading: Bool? = false
    func addView() {
        let view = UIView(frame: self.frame)
        view.backgroundColor = UIColor.white
        self.addSubview(view)
    }
}

class ViewController : UIViewController, UITableViewDelegate, UITableViewDataSource {

    fileprivate let tableView: UITableView = UITableView(frame: CGRect.init(x: 0, y: 0, width: 300, height: 300), style: UITableViewStyle.plain)

    override func viewDidLoad() {
        self.setupTableView()

    }

    fileprivate func setupTableView() {
        self.tableView.dataSource = self
        self.tableView.delegate = self
        tableView.backgroundColor = UIColor.white
        tableView.isOpaque = true
        view.addSubview(self.tableView)
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default, reuseIdentifier: "CellIdentifier")

        let buttonSize = 30
        let btn = DownloadUIButton(frame: CGRect(x: 10, y: 10, width: buttonSize, height: buttonSize))
        btn.backgroundColor = UIColor.red
        btn.addTarget(self, action:#selector(handleDownload(_:)), for: .touchUpInside)
        cell.addSubview(btn)

        return cell
    }

    @objc func handleDownload(_ btn: DownloadUIButton) {
        btn.addView()
    }

}

但是,该项目会出现此错误:

2017-10-28 12:55:41.558522 + 0100 TestProject [21392:1779236] ***由于未捕获的异常'CALayerInvalid'终止应用程序,原因:'图层是其图层树中循环的一部分'

1 个答案:

答案 0 :(得分:1)

要使视图显示在按钮前面,我只需使用相同的框架制作兄弟视图。在发布时将自定义视图的isHidden设置为true,单击该按钮时,将按钮的isHidden设置为true,将自定义视图的isHidden设置为false。或者,如果您确实希望按钮在自定义视图的透明部分后面可见,则可以使用sendSubview(toBack:)使按钮显示在自定义视图的后面。