Подкласс 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
     }
}

Тем не менее, если вы хотите знать, как это произошло, как вы объяснили выше, вы должны выполнить следующие шаги:

  1. Вы должны подкласс от 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)
         }
      }   
    }
    
  2. Твой класс 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")
      }
    
    }
    
  3. Вы должны быть в Интерфейсном Разработчике выбрать свой 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, чтобы он заработал.

UIResponder Apple Docs

Другие вопросы по тегам