Как обрабатывать UIPanGestureRecognizer и UISwipeGestureRecognizer (сверху и снизу)

Мне нужно сделать вид, похожий на экран iPhone (не совсем так, а вести себя жестом прокрутки вверх / вниз и UIPanesture ) на скриншоте ниже.

посмотреть скриншот

Проверьте код здесь. У меня работает только Pangature, у меня оба должны работать?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let pan = UIPanGestureRecognizer(target:self, action:#selector(ViewController.handlePan(sender:)))
    pan.maximumNumberOfTouches = 1
    pan.minimumNumberOfTouches = 1
    slideView.addGestureRecognizer(pan)

    let swipeUp = UISwipeGestureRecognizer(target: self, action:  #selector(ViewController.respondToSwipeGesture(gesture:)))
    swipeUp.direction = UISwipeGestureRecognizerDirection.up
    slideView.addGestureRecognizer(swipeUp)

    let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(gesture:)))
    swipeDown.direction = UISwipeGestureRecognizerDirection.down
    slideView.addGestureRecognizer(swipeDown)
    print(self.slideView.frame.origin.y)

}
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}
@IBAction func respondToSwipeGesture(gesture: UIGestureRecognizer) {

    if let swipeGesture = gesture as? UISwipeGestureRecognizer {


        switch swipeGesture.direction {
        case UISwipeGestureRecognizerDirection.right:
            print("Swiped right")
        case UISwipeGestureRecognizerDirection.down:
            print("Swiped down")
            animateSlideView()
        case UISwipeGestureRecognizerDirection.left:
            print("Swiped left")
        case UISwipeGestureRecognizerDirection.up:
            print("Swiped up")
            animateSlideView()
        default:
            break
        }
    }
}



@IBAction func slideView(_ sender: Any) {

    animateSlideView()

}

func animateSlideView(){
    UIView.animate(withDuration: 0.7, animations: {
        if self.toggleTop == true{
            self.toggleTop = false
            self.slideView.frame =  CGRect(x: 0, y: 670, width: self.slideView.frame.size.width, height: self.slideView.frame.size.height)
        }else {
            self.toggleTop = true
            self.slideView.frame =  CGRect(x: 0, y: 150, width: self.slideView.frame.size.width, height: self.slideView.frame.size.height) // CGRectMake(0, 670, self.slideView.frame.size.width, self.slideView.frame.size.height)
        }
        self.slideView.layoutIfNeeded()
    })
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


@IBAction func handlePan(sender: UIPanGestureRecognizer) {
    var touchPointOffset:CGPoint = CGPoint(x: 0, y: 0)
    let vel = sender.velocity(in: self.view)
    //print(vel.y)
    print(sender.location(in: slideView).y)
    let actualPosition = sender.view!.center.y - 319.0
    let translation = sender.translation(in: self.view)
    // [gestureRecognizer locationInView:self.panelViewController.view].y <
    if (sender.state == .began || sender.state == .changed) {
        if actualPosition > 670 {

        } else if actualPosition < 150 {

        } else{
            sender.view!.center = CGPoint(x: sender.view!.center.x , y: sender.view!.center.y + translation.y)
        }
         touchPointOffset = sender.location(in: slideView)
         //self.touchPointOffset =  sender.location(in: slideView) //[gestureRecognizer locationInView:self.panelViewController.view];
    }else if  sender.state == .cancelled{
        print("canceled")
    }else if  sender.state == .ended{
        print(sender.location(in: slideView).y)
        //print(vel.y)
        touchPointOffset = CGPoint(x: 0, y: 0)
        if (vel.y > 0.0) {
            if actualPosition >= 670 ||  actualPosition >= UIScreen.main.bounds.height / 2.0 {
                UIView.animate(withDuration: 0.7, animations: {
                    self.toggleTop = false
                    sender.view!.center = CGPoint(x: sender.view!.center.x , y: 989.0)
                    self.slideView.layoutIfNeeded()
                })

            }else if actualPosition <= 150 || actualPosition <= UIScreen.main.bounds.height / 2.0{
                UIView.animate(withDuration: 0.7, animations: {
                    self.toggleTop = true
                    sender.view!.center = CGPoint(x: sender.view!.center.x , y: 469.0)
                    self.slideView.layoutIfNeeded()
                })

            }
        }

        //print(vel.y)

    }

    sender.setTranslation( CGPoint(x: 0,y :0), in: self.view)
}

person Humza Shahid    schedule 17.02.2017    source источник
comment
Вы пытались установить точки останова для обоих методов?   -  person user3581248    schedule 17.02.2017


Ответы (1)


Вы используете метод делегата shouldRecognizeSimultaneouslyWithGestureRecognizer из UIGestureRecognizerDelegate, но не похоже, что вы настроили свой ViewController для соответствия этому делегату. Первый:

class ViewController: UIViewController, UIGestureRecognizerDelegate {

}

Затем убедитесь, что свойство delegate для UIGestureRecogniers, которое вам нужно распознать одновременно, установлено на self (для вашего ViewController):

override func viewDidLoad() {
    super.viewDidLoad()

    let pan = UIPanGestureRecognizer(target:self, action:#selector(ViewController.handlePan(sender:)))
    pan.delegate = self     //  HERE - for the delegate
    pan.maximumNumberOfTouches = 1
    pan.minimumNumberOfTouches = 1
    slideView.addGestureRecognizer(pan)

    let swipeUp = UISwipeGestureRecognizer(target: self, action:  #selector(ViewController.respondToSwipeGesture(gesture:)))
    swipeUp.delegate = self     //  HERE - for the delegate
    swipeUp.direction = UISwipeGestureRecognizerDirection.up
    slideView.addGestureRecognizer(swipeUp)

    let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(gesture:)))
    swipeDown.delegate = self     //  HERE - for the delegate
    swipeDown.direction = UISwipeGestureRecognizerDirection.down
    slideView.addGestureRecognizer(swipeDown)
    print(self.slideView.frame.origin.y)

}
person Pierce    schedule 17.02.2017
comment
Спасибо, это работает и намного лучшее решение. Отличная работа. - person Humza Shahid; 20.02.2017
comment
@HumzaShahid - Добро пожаловать! Поскольку это работает, не могли бы вы принять это как правильный ответ, чтобы я получил признание? Удачи. - person Pierce; 20.02.2017
comment
@HumzaShahid, если это работает, почему ты его не выбрал? Он заслуживает похвалы, и принятые ответы помогают всем - person Lance Samaria; 20.05.2020