Ao criar a visualização de rolagem, certifique-se de definir isto:
scrollView.showsHorizontalScrollIndicator = false
scrollView.showsVerticalScrollIndicator = false
scrollView.pagingEnabled = true
Em seguida, adicione suas subvisualizações ao scroller em um deslocamento igual ao índice * altura do scroller. Isso é para um scroller vertical:
UIView * sub = [UIView new];
sub.frame = CGRectMake(0, index * h, w, subViewHeight);
[scrollView addSubview:sub];
Se você executá-lo agora, as visualizações são espaçadas e, com a paginação ativada, elas rolam uma de cada vez.
Então, coloque isso em seu método viewDidScroll:
int index = scrollView.contentOffset.y / h;
float y = scrollView.contentOffset.y;
float p = (y / h)-index;
int subViewHeight = h-240;
int spacing = 30;
NSArray * array = scrollView.subviews;
for (UIView * sub in array){
int subIndex = (int)[array indexOfObject:sub];
float transform = (-h * subIndex);
transform += (subViewHeight + spacing) * subIndex;
transform += (h - subViewHeight - spacing) * p;
transform += index * (h - subViewHeight - spacing);
sub.transform = CGAffineTransformMakeTranslation(0, transform);
}
Os frames das subvisualizações ainda estão espaçados, estamos apenas movendo-os juntos por meio de uma transformação conforme o usuário rola.
Além disso, você tem acesso à variável p acima, que pode ser usada para outras coisas, como alfa ou transformações nas subvisões. Quando p == 1, essa página está sendo exibida na íntegra, ou melhor, tende para 1.