Подкласс UIScrollView в Swift для прикосновений
Я использую Swift 1.2
Я пытаюсь использовать это UIScrollview, касалось начатых, касаний, движений, касаний и ссылок во втором комментарии принятого ответа.
Я использую раскадровку с автоматическим макетом, я установил свой пользовательский класс для UIScrollView в пользовательском классе.
Я не получаю ни одно из этих событий касания в UIViewController, который содержит мой пользовательский UIScrollView
Изменить: Обновил мой код для того, как я использую его с ответом @Victor Sigler.
Пользовательский код ScrollView:
import UIKit
protocol PassTouchesScrollViewDelegate {
func scrollTouchBegan(touches: Set<NSObject>, withEvent event: UIEvent)
func scrollTouchMoved(touches: Set<NSObject>, withEvent event: UIEvent)
}
class PassTouchesScrollView: UIScrollView {
var delegatePass : PassTouchesScrollViewDelegate?
override init(frame: CGRect) {
super.init(frame: frame)
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
self.delegatePass?.scrollTouchBegan(touches, withEvent: event)
}
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
self.delegatePass?.scrollTouchMoved(touches, withEvent: event)
}
}
Мой ViewController:
import UIKit
class ViewController: UIViewController, PassTouchesScrollViewDelegate {
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegatePass = self
}
func scrollTouchBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
println("began \(touches)")
}
func scrollTouchMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
println("moved \(touches)")
}
}
Я пытаюсь позволить пользователю нарисовать линию над UIImage, который я получил, используя PanGesture Recognizer, но производительность была очень плохой, особенно на старом оборудовании, я следовал руководству Ray Wenderlich, в котором использовались касания Began, и производительность была очень высокой лучше, однако, это было на UIView и не ScrollView. Мне нужен UIScrollView, так как перед тем, как пользователь рисует изображение, он может увеличивать и увеличивать его.
3 ответа
Я думал, что вы думаете об этом неправильно. Если вы хотите знать, когда UIScrollView
движется, нет необходимости создавать подклассы. iOS настроила все необходимые методы внутри UIScrollViewDelegate
,
Вы должны реализовать UISCrollViewDelegate
получать уведомления о действиях в UIScrollView
и установить delegate
Интерфейсный Разработчик или в коде, зависит от вас.
Смотрите следующий пример, чтобы узнать, как это сделать, например:
class ViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
self.scrollView.delegate = self
}
}
Тем не менее, если вы хотите знать, как это произошло, как вы объяснили выше, вы должны выполнить следующие шаги:
Вы должны подкласс от
UIScrollView
класс, как вы сделали в своем классеPassTouchesScrollView
и реализовать шаблон делегата, который будет уведомлен оUIScrollView
следующим образом:import UIKit protocol PassTouchesScrollViewDelegate { func touchBegan() func touchMoved() } class PassTouchesScrollView: UIScrollView { var delegatePass : PassTouchesScrollViewDelegate? override init(frame: CGRect) { super.init(frame: frame) } required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { // Notify it's delegate about touched self.delegatePass?.touchBegan() if self.dragging == true { self.nextResponder()?.touchesBegan(touches, withEvent: event) } else { super.touchesBegan(touches, withEvent: event) } } override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) { // Notify it's delegate about touched self.delegatePass?.touchMoved() if self.dragging == true { self.nextResponder()?.touchesMoved(touches, withEvent: event) } else { super.touchesMoved(touches, withEvent: event) } } }
Твой класс
ViewController
должен быть реализован следующим образом:class ViewController: UIViewController, UIScrollViewDelegate { @IBOutlet weak var scrollView: PassTouchesScrollView! override func viewDidLoad() { super.viewDidLoad() scrollView.delegate = self scrollView.delegatePass = self } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func touchMoved() { println("touch moved") } func touchBegan() { println("touch began") } }
Вы должны быть в Интерфейсном Разработчике выбрать свой
UIScrollView
и установите класс для него как ваш классPassTouchesScrollView
, в Идентификационном инспекторе в части класса.
И вы должны увидеть в своей консоли следующее:
touch began
touch began
touch began
touch began
touch began
touch began
touch moved
touch move
Я надеюсь, что это поможет вам.
Попробуй это
extension UIScrollView {
override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.next?.touchesBegan(touches, with: event)
print("touchesBegan")
}
override open func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
self.next?.touchesMoved(touches, with: event)
print("touchesMoved")
}
override open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
self.next?.touchesEnded(touches, with: event)
print("touchesEnded")
}
}
touchesBegan
работает только на подклассе UIView
, Возьмите его из своего UIViewController, чтобы он заработал.