Swift: цель не вызывается на подклассе UIButton - PullRequest
0 голосов
/ 28 марта 2019

CustomButton.swift

class CustomButton: UIButton {

    override func draw(_ rect: CGRect) {
        //drawing code
    }
}

ViewController.swift

let testCustom = CustomButton()
testCustom.draw(CGRect(x: 0, y: 0, width: 0, height: 0))
testCustom.isUserInteractionEnabled = true
testCustom.addTarget(self, action: #selector(Start(_:)), for: .touchUpInside)
self.view.addSubview(testCustom)

@objc func Start(_ sender: CustomButton) {
    print("pressed start")
}

Кнопка отображается на экране, но функция не вызывается при нажатии кнопки.Любые идеи, почему?

Я также попробовал функцию и код addTarget в CustomButton.swift, но не смог заставить это тоже срабатывать.

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

@ Мухаммад Вакас Бхати сделал хороший вопрос, спрашивая о кадре.

Я использовал addSublayer, чтобы нарисовать созданный мной путь на экране. Моя ошибка была в том, что я устанавливал значения в функции draw () и добавлял CAShapeLayer с addSublayer, но рамка для кнопки не была установлена.

Даже если нарисованный слой является подслоем кнопки, он отображается в координатах и ​​размерах, указанных для слоя, без какого-либо отношения к рамке его «родительской» кнопки.

Кадр кнопки может быть (0, 0, 0, 0) или (0, 0, 100, 100), а изображение, нарисованное в addSublayer, все еще может иметь значение (250, 200, 75, 80), так что видимое изображение будет находиться в одной точке экрана, но фактическая кнопка находится в несвязанном месте с тем, что видно в ее подслое.

0 голосов
/ 28 марта 2019

Ниже приведен простой пример создания экземпляра подкласса UIButton в контроллере представления (UIViewController). Протестировано под Swift 4.2.

// Subclassing UIButton //
import UIKit

class MyButton: UIButton {
    var tintColor0: UIColor!
    var tintColor1: UIColor!
    var borderColor: UIColor!
    var backColor: UIColor!
    var cornerRadius: CGFloat!

    required init(frame: CGRect, tintColor0: UIColor, tintColor1: UIColor, borderColor: UIColor, backColor: UIColor, cornerRadius: CGFloat, titleString: String) {
        super.init(frame: frame)

        self.tintColor0 = tintColor0
        self.tintColor1 = tintColor1
        self.borderColor = borderColor
        self.backColor = backColor
        self.cornerRadius = cornerRadius
        self.setTitle(titleString, for: .normal)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func draw(_ rect: CGRect) {
        super.draw(rect)

        self.setTitleColor(tintColor0, for: .normal)
        self.setTitleColor(tintColor1, for: .highlighted)
        self.layer.borderColor = borderColor.cgColor
        self.layer.cornerRadius = cornerRadius
        self.layer.borderWidth = 1.0
        self.layer.backgroundColor = backColor.cgColor
    }
}

// View controller //
import UIKit

class ViewController: UIViewController {
    // MARK: - Variables

    // MARK: - IBOutlet

    // MARK: - IBAction

    // MARK: - Life cycle
    override func viewDidLoad() {
        super.viewDidLoad()

        let buttonRect = CGRect(x: 20.0, y: 160.0, width: 100.0, height: 32.0)
        let myButton = MyButton(frame: buttonRect, tintColor0: UIColor.black, tintColor1: UIColor.gray, borderColor: UIColor.orange, backColor: UIColor.white, cornerRadius: 8.0, titleString: "Hello")
        myButton.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)
        view.addSubview(myButton)
    }

    @objc func buttonTapped(_ sender: UIButton) {
        print("Hello!?")
    }
}
...