The big gotcha about scrolling is to determine the offset necessary to present (for instance) a Textfield inside a StackView with is inside the ScrollView.
If you try to get the position of Textfield.frame.minY
can be 0, because the minY frame is only considering the distance between the element and the top of the StackView. So you have to consider all other parent stackviews/views.
A good workaround for this is:
1 - Implement the ScrollView Extension
extension UIScrollView {
func scrollToShowView(view: UIView){
var offset = view.frame.minY
var superview = view.superview
while((superview != nil)){
offset += (superview?.frame.minY)!
superview = superview?.superview
}
offset -= 100 //optional margin added on offset
self.contentOffset = CGPoint.init(x: 0, y: offset)
}
}
This will consider all parent view and sum the necessary offset for the scrollview present the necessary view on screen (for example a Textfield which cannot stay behind the user keyboard)
Usage example:
func textViewDidBeginEditing(_ textView: UITextView) {
self.contentScrollView.scrollToShowView(view: textView)
}