2016-07-23 1 views
0

Я могу включить/отключить прокрутку эффективно, используя свойство scrollView.scrollEnabled.iOS: Как включить UIScrollView Panning при длинном нажатии

В настоящее время я включаю прокрутку, когда состояние longPressRecognizer равно UIGestureStateBegan и отключает прокрутку, когда оно UIGestureStateEnded.

Когда я долгое время нажимаю, а затем перетаскиваю палец, scrollView не прокручивается.

Я думаю, что как-то Scrollview-х panGestureRecognizer не получает события прикосновения, что это странно, так как scrollView является (я проверил с помощью touchesBegan, touchesMoved, и т.д. методы).

ответ

0

UIScrollView не получает касаний, потому что прикосновение началось до того, как вы включили прокрутку в UIScrollView. Этот пример кода управляет прокруткой для вас с UILongPressGestureRecognizer, прокрутка большой UIImageView:

@IBOutlet weak var scrollView: UIScrollView! 
@IBOutlet var gr: UILongPressGestureRecognizer! 
var initialPos = CGPointZero 
var dragPos = CGPointZero 

// This action is bound to long press gesture recognizer within Interface Builder 
@IBAction func longpressHandler(sender: UILongPressGestureRecognizer) { 
    if sender.state == .Began { 
     // Save initial position for moving 
     initialPos = sender.locationInView(scrollView) 
    } 
    else if sender.state == .Changed { 
     // Get new drag location 
     let loc = sender.locationInView(scrollView) 
     let newPos = CGPoint(x: initialPos.x - loc.x + dragPos.x, y: initialPos.y - loc.y + dragPos.y) 
     dragPos = newPos 
     scrollView.contentOffset = newPos 
    } 
    else if sender.state == .Ended { 
     // Check for end position of the content, snap it back to the edge of the screen if moved too far 
     var newOffset = scrollView.contentOffset 
     var move = false 
     if scrollView.contentOffset.x < 0 { 
      newOffset.x = 0 
      move = true 
     } 
     if scrollView.contentOffset.y < 0 { 
      newOffset.y = 0 
      move = true 
     } 
     if scrollView.contentOffset.x > photo.frame.size.width - scrollView.frame.size.width { 
      newOffset.x = max(self.photo.frame.size.width - self.scrollView.frame.size.width, 0) 
      move = true 
     } 
     if scrollView.contentOffset.y > photo.frame.size.height - scrollView.frame.size.height { 
      newOffset.y = max(self.photo.frame.size.height - self.scrollView.frame.size.height, 0) 
      move = true 
     } 
     if move { 
      UIView.animateWithDuration(0.25, animations: { 
       self.scrollView.contentOffset = newOffset 
      }) 
     } 
    } 
} 

var photo = UIImageView(image: UIImage(named: "photo")) 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Set up your scrollview 
    scrollView.addSubview(photo) 
    scrollView.contentSize = photo.frame.size 

    // add the long press gesture recognizer to the scrollview 
    scrollView.addGestureRecognizer(gr) 
} 
+0

Спасибо! Это прекрасно работает, ты святой! –