Насколько мне известно, не в CSS 2. CSS 3 имеет более надежные селектор, но не всегда реализуется во всех браузерах. Даже с улучшенными селекторами я не верю, что он выполнит именно то, что вы указали в своем примере.
@MuhammadWaqasBhati очень хорошо поинтересовался рамкой.
Я использовал addSublayer, чтобы нарисовать путь, который я создал на экране. Моя ошибка была в том, что я устанавливал значения в функции draw () и добавлял CAShapeLayer с помощью addSublayer, но рамка для кнопки не была установлена.
Даже если нарисованный слой является подслоем кнопки, он отображается в координатах и размерах, предоставленных для слоя, без какого-либо отношения к рамке его «родительской» кнопки.
Кадр кнопки может быть (0, 0, 0, 0) или (0, 0, 100, 100), а изображение, нарисованное в addSublayer, все еще может иметь значение (250, 200, 75, 80), так что видимое изображение будет в одной точке экрана, но фактическая кнопка находится в несвязанном месте с тем, что видно в ее подслое.
Далее приведен простой пример того, как создать экземпляр подкласса 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!?")
}
}
Это похоже на проблему с памятью. Вам нужно удерживать ссылку на эту кнопку, иначе она будет освобождена в конце области. Попробуйте сначала определить кнопку в данном классе, а затем установить ее цель.