Paging UIScrollView with peeking neighbor pages

You need to add a view 'behind' the scroll view which covers the entire area where your pages will be visible. This view should implement -hitTest:withEvent:. This method will get called by the OS to determine where to route a particular touch event. All you need to do is return your scroll view for any points within this backing view:

Objective-C

- (UIView *) hitTest: (CGPoint) pt withEvent: (UIEvent *) event {
    if (CGRectContainsPoint(self.bounds, pt)) return self.scrollView;
    return [super hitTest: pt withEvent: event];
}

Swift 4.0

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    return self.bounds.contains(point) ? self.scrollView : super.hitTest(point, with: event)
}

I don't have a high enough ranking to comment on the answers above but you can find a tutorial and sample code on Ray Wenderlich's site: How To Use UIScrollView to Scroll and Zoom Content

This code does use the techniques listed above, specifically the hit test logic.