Самый безопасный и самый успешный метод, который я нашел, чтобы ограничить движение представления прокрутки, это создать подкласс UIScrollView и переопределить setContentOffset: animated: и setContentOffset: методы (код ниже).
Преимущество переопределения этих методов заключается в том, что он напрямую изменяет запрошенный contentOffset до того, как какой-либо код UIKit начинает воздействовать на него, избегая любых побочных эффектов, которые могут возникнуть при изменении contentOffset в scrollViewDidScroll: или другие UIScrollViewDelegate методы.
Создание нового подкласса занимает всего несколько минут, и он работает как шарм.
- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated {
// restrict movement to vertical only
CGPoint newOffset = CGPointMake(0, contentOffset.y);
[super setContentOffset:newOffset animated:animated];
}
- (void)setContentOffset:(CGPoint)contentOffset {
// restrict movement to vertical only
CGPoint newOffset = CGPointMake(0, contentOffset.y);
[super setContentOffset:newOffset];
}