In Swift 4.1
Вы можете добавить свой собственный вид с вашими собственными дизайнами / анимацией / цветами / и т. Д., Используя Quartz2D, следующим образом.
- Создайте свой собственный вид с помощью пользовательских кварцевых элементов
- Добавьте ваш UIBarButtonItem с настраиваемым видом
- Добавить протокол (он вам понадобится, потому что UIBarButtonItem, инициализированный с настраиваемым представлением, ожидает, что представление будет обрабатывать взаимодействия с пользователем, и, следовательно, не обеспечивает способ установки цели / селектора)
Элемент панели кнопок, созданный этим методом, не вызывает действие
метод его цели в ответ на взаимодействие с пользователем. Вместо этого
элемент кнопки панели ожидает, что указанное пользовательское представление будет обрабатывать любого пользователя
взаимодействия и предоставить соответствующий ответ.
Не забудьте добавить, что ваше представление должно соответствовать протоколу (CameraButtonDelegate
в данном случае), а также добавить метод cameraButtonChanged(to:)
для захвата пользовательских взаимодействий
func setupButton() {
customView = CameraButton()
customView.frame = CGRect(x: 0, y: 0, width: 25, height: 25)
customView.delegate = self
let barButtonItem = UIBarButtonItem(customView:customView)
self.navigationItem.rightBarButtonItem = torchItem
}
protocol CameraButtonDelegate {
func cameraButtonChanged(to state:Bool)
}
class CameraButton: UIView {
var delegate: CameraButtonDelegate?
var active: Bool = false
var strokeColor = UIColor.gray
init() {
self.init()
self.backgroundColor = .clear
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.active = self.active ? false : true
self.strokeColor = self.active ? UIColor.blue : UIColor.gray
setNeedsDisplay()
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
self.delegate?.cameraButtonChanged(to: self.active)
}
override func draw(_ rect: CGRect) {
let context = UIGraphicsGetCurrentContext()
context?.setStrokeColor(strokeColor.cgColor)
context?.setLineWidth(1.0)
// Add your Quartz stuff here
context?.strokePath()
}
}