Manually scrolling UIScrollView (iOS/Swift)
Recently while working with one of my libraries, I realized that I wanted to manually scroll UIScrollView in any direction. (Viz. Top, Right, Bottom, Left). It took me quite time to find examples online. But I take this moment to compile them together.
Since Swift is a hot word in iOS kingdom, I will make a UIScrollView extension with Swift which can be used to manually scroll the view in any direction.
In order to take advantage of Swift constructs, I have used enums and encapsulated as much logic possible inside enum since Swift enables us to include methods inside enum.
Let's start with
enumdefining 4 directions
enum ScrollDirection {
    case Top
    case Right
    case Bottom
    case Left
}
Now let's include additional methods to this enum which will take UIScrollView instance as a parameter and depending on the value of self, it will return appropriate contentOffset
enum ScrollDirection {
    case Top
    case Right
    case Bottom
    case Left
    
    func contentOffsetWith(scrollView: UIScrollView) -> CGPoint {
        var contentOffset = CGPoint.zero
        switch self {
            case .Top:
                contentOffset = CGPoint(x: 0, y: -scrollView.contentInset.top)
            case .Right:
                contentOffset = CGPoint(x: scrollView.contentSize.width - scrollView.bounds.size.width, y: 0)
            case .Bottom:
                contentOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height)
            case .Left:
                contentOffset = CGPoint(x: -scrollView.contentInset.left, y: 0)
        }
        return contentOffset
    }
}
We are almost there. Now add an extension to
UIScrollViewwhich will take parameterdirectionof typeScrollDirectionand optional parameter which will indicate if we want scrolling action to be animated or not.
extension UIScrollView {
    func scrollTo(direction: ScrollDirection, animated: Bool = true) {
        self.setContentOffset(direction.contentOffsetWith(self), animated: animated)
    }
}
So for example, if you want to manually scroll any UIScrollView instance, you will just utilize the above code as follows,
let myScrollView = UIScrollView()
// With animation - Animation is enabled by default
myScrollView.scrollTo(.Top/.Right/.Bottom/.Left)
// Without animation
myScrollView.scrollTo(.Top/.Right/.Bottom/.Left, animated: false)
Hope this will help you in any of your side projects. The beauty of this approach is that we managed to move code which calculates content offset inside
enumconstruct - MakingUIScrollViewextension easier to manage
 
                    
