0

Okay, I've created a pageview slider app. Everything works great, but now I'd like to be able to Pinch In/Out of my UIPageViewController using UIPinchGestureRecognizer.

I have everything set up in code, but I still get this ERROR when I pinch.

Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[App.ViewController pinchDetected]: unrecognized selector sent 
to instance 0x7faadc90c6f0'

How can I use my pinchDetected function in the UIPageViewController using UIPinchGestureRecognizer?

Please let me now if I am doing this wrong. New to swift/ios

my code

class ViewController: UIViewController, UIPageViewControllerDataSource {

var pageViewController: UIPageViewController!

private var allPages = [Page]()
var pages = NSMutableOrderedSet()

override func viewDidLoad() {
    super.viewDidLoad()

    ###PinchRecognizer
    var pinchRecognizer = UIPinchGestureRecognizer(target:self, action:"pinchDetected")
    self.view.addGestureRecognizer(pinchRecognizer)

    self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController
    self.pageViewController.dataSource = self

    var startVC = self.viewControllerAtIndex(0) as ContentViewController
    var viewControllers = NSArray(object: startVC)
    self.pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Forward, animated: true, completion: nil)

    self.pageViewController.view.frame = CGRectMake(0, 30, self.view.frame.width, self.view.frame.size.height)

    self.addChildViewController(self.pageViewController)
    self.view.addSubview(self.pageViewController.view)
    self.pageViewController.didMoveToParentViewController(self)
}

###PinchRecognizer Function
func pinchDetected(pinchRecognizer: UIPinchGestureRecognizer) {
    var scale: CGFloat = pinchRecognizer.scale;
    self.view.transform = CGAffineTransformScale(self.view.transform, scale, scale);
    pinchRecognizer.scale = 1.0;
}

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
    var vc = viewController as! ContentViewController
    var index = vc.pageIndex as Int

    if (index == 0 || index == NSNotFound) {
        return nil
    }

    index--
    return self.viewControllerAtIndex(index)
}

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {

    var vc = viewController as! ContentViewController
    var index = vc.pageIndex as Int

    if (index == NSNotFound) {
        return nil
    }

    index++

    if (index == self.pages.count) {
        return nil
    }

    return self.viewControllerAtIndex(index)

}

func viewControllerAtIndex(index: Int) -> ContentViewController
{
    if ((self.pages.count == 0) || (index >= self.pages.count)) {
        return ContentViewController()
    }

    var vc: ContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ContentViewController") as! ContentViewController

    ###Store image in imageFile
    var image = (pages.objectAtIndex(index) as! Page).image        
    vc.imageFile = image
    vc.pageIndex = index

    return vc

}

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int
{
    return self.pages.count
}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int
{
    return 0
}

} 
Serge Pedroza
  • 2,160
  • 3
  • 28
  • 41

2 Answers2

2

Your selector action:"pinchDetected" is wrong. It should be action:"pinchDetected:".

sahara108
  • 2,829
  • 1
  • 22
  • 41
  • 1
    sahara108 is right and faster than me to comment. When you have a parameter add ":" to the action name. It may be the cause error. – MacKentoch Apr 22 '15 at 03:15
  • This still crashes. I think the action needs an `@objc` flag. If you use selectors (see G Clovs answer), the compiler will complain about the missing `@objc` flag. – endavid Apr 14 '19 at 10:15
1

Swift 3:

//PinchRecognizer
let pinchRecognizer = UIPinchGestureRecognizer(target:self, action: #selector(pinchDetected))
self.view.addGestureRecognizer(pinchRecognizer)

And your action needs to be flagged as an ObjectiveC function,

@objc
func pinchDetected(pinchRecognizer: UIPinchGestureRecognizer) {
  // ...
}
endavid
  • 1,781
  • 17
  • 42
G Clovs
  • 2,442
  • 3
  • 19
  • 24